Fragment與Activity的通信(回調),Fragment間的通信

一、消息Fragment-->Activity

1、Fragment啓動Activity時通過Intent將數據傳遞過去,這種方法每次都要重啓Activity。

2、通過回調方法:

  2.1 普通的回調方法。


Fragment類中定義方法switch
private void switch(Fragment f) {
	if(f != null){
		if(getActivity() instanceof MainActivity){
			((MainActivity)getActivity()).switchFragment(f);
		}
	}
}
       該方法MainActivity 的實例,實現調用MainActivity 中的方法實現通信。
       MainActivity類中對應的回調方法switchFragment(Fragment f)完成響應。

  2.2 通過接口實現回調:


    2.2.1 在Fragment類中定義接口及抽象方法,並在onAttach方法中添加如下代碼:

private OnFragmentChangeListener mCallBack;

public interface OnFragmentChangeListener {
	public void onTabSwitch(int position);
}

@Override
public void onAttach(Activity activity) {
	super.onAttach(activity);
	//確保包含Fragment的Activity已經實現了回調接口,否則拋出異常
	try {
		mCallBack = (OnFragmentChangeListener) activity;
	} catch (Exception e) {
		throw new ClassCastException(activity.toString()
					+ " must implement OnFragmentChangeListener");
	}
}

    2.2.2 在Activity中實現上面的接口:

public class TestActivity extends Activity implements
		MyFragment.OnFragmentChangeListener {
	@Override
	public void onTabSwitch(int position) {
		//此處接收事件的回調
	}
}

    2.2.3 在Fragment將信息發送給父Activity:

mCallBack.onTabSwitch(pos);

      兩種回調方法都很適用於通過Fragment切換Activity的頁面。

二、消息從Activity-->Fragment

1、通過實例化一個Fragment

    在Activity中設置如下代碼攜帶參數傳遞給Fragment:
Fragment2 newFragment = new Fragment2();
Bundle args = new Bundle();
args.putInt(Fragment2.ARG_KEY, position);
newFragment.setArguments(args);
getFragmentManager().beginTransaction().replace(R.id.frame, newFragment).commit();

   或者通過構造方法將數據傳遞給Fragment(官方不推薦):
Fragment2 newFragment = new Fragment2(arg1,arg2);


推薦做法:

1.1在Fragment中

public static MyFragment newInstance(String userName, String password) {
		MyFragment frgmt = new MyFragment();
		Bundle args = new Bundle();
		args.putString("userName", userName);
		args.putString("password", password);
		frgmt.setArguments(args);
		return frgmt;
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (null != getArguments()) {
			String userName = getArguments().getString("userName");
			String password = getArguments().getString("password");
		}
	}


1.2Activity中調用:

MyFragment myFragment = MyFragment.newInstance("myName", "myPsw");


2、通過findFragmentById()或者findFragmentByTag()方法找到Fragment的實例:


MyFragment fragment = (MyFragment) getFragmentManager().findFragmentById(R.id.frame);
if(fragment!=null){
	fragment.frgmtFunc();
}

參考自:http://blog.csdn.net/xyz_lmn/article/details/8631195#t1













    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章