FragmentとActivity間の通信(相互呼び出し方法)

18234 ワード

今日viewPagerでfragmentをネストするには、fragmentがactivityを呼び出す方法が必要で、activityがfragmentを呼び出す方法が必要で、しばらくはどうすればいいか分かりません.その後、ActivityにおいてインタフェースとHandlerを定義、インタフェースの役割はフラグメントにActivityの命令を受信させることであり、Handlerはフラグメントからの命令を受信するために使用され、Activityは操作を実行する.
次のようになります.
package com.example.fragmentactivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;

public class MainActivity extends FragmentActivity implements OnClickListener {
	private Button button1;
	private String fragmentName;
	private OnButtonClickedListener buttonClickedListener;
	/**
	 *  Handler Activity 
	 */
	public Handler handler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg!=null){
				switch (msg.what) {
				case 100:
					/**
					 *  ,Activity 
					 */
					fragmentName=Fragment2.class.getName();
					replaceFragment(R.id.FrameLayout1, fragmentName);
					break;

				default:
					break;
				}
			}
		}
		
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1=(Button) findViewById(R.id.button1);
		button1.setOnClickListener(this);
		/**
		 *  
		 */
		fragmentName=Fragment1.class.getName();
		replaceFragment(R.id.FrameLayout1, fragmentName);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			if(buttonClickedListener!=null){
				buttonClickedListener.onclicked("Activity: , ");
			}
			break;
		default:
			break;
		}

	}
	/*
	 * 
	 *  
	 */
	protected void replaceFragment(int viewResource, String fragmentName) {
		FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
		Fragment fragment = Fragment.instantiate(this, fragmentName);
		ft.replace(viewResource, fragment);
		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		ft.commit();
		getSupportFragmentManager().executePendingTransactions();
	}
	/**
	 *  
	 * @author zqy
	 *
	 */
	public  interface OnButtonClickedListener{
		/**
		 *  
		 * @param s
		 */
			public void onclicked(String s);
	}
	/**
	 * 
	 * @param buttonClickedListener
	 *  
	 */
	public void setButtonClickedListener(OnButtonClickedListener buttonClickedListener){
		this.buttonClickedListener=buttonClickedListener;
	}


	
	
}

これがActivityのコードです.次のように2つの破片を書きます.
Fragment1:
package com.example.fragmentactivity;


import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.fragmentactivity.MainActivity.OnButtonClickedListener;

public class Fragment1 extends Fragment implements OnClickListener {
	private TextView textView;
	private Button button;
	private Handler handler;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		MainActivity activity=(MainActivity) getActivity();
		/**
		 *  Activity Handler
		 */
		handler=activity.handler;
		/**
		 *  
		 */
		activity.setButtonClickedListener(new OnButtonClickedListener() {
			
			@Override
			public void onclicked(String s) {
				/*
				 *  Activity 
				 */
				textView.setText(s);
				button.setVisibility(View.VISIBLE);
			}
		});
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.item1, null);
	}
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		textView=(TextView) getActivity().findViewById(R.id.textView1);
		button=(Button) getActivity().findViewById(R.id.button2);
		button.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button2:
			/**
			 *  Activity
			 */
			handler.sendEmptyMessage(100);
			break;

		default:
			break;
		}
	}

この破片はそのActivityにこのインタフェースを実現させ、インタフェースの中の値をページに表示し、この破片の中のButtonをクリックしてActivityにメッセージを送信する.この中で私が送ったのは100です.
Fragment2:
package com.example.fragmentactivity;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.item2, null);
	}
}

これで終わります.今後のプロジェクトも破片を恐れずActivityと通信した.