Activity與Fragment交互的幾種方式

第一種

首先我們來介紹使用Handler來實現Fragment與Activity 的交互。

第一步,我們需要在Activity中定義一個方法用來設置Handler對象。

public void setHandler(Handler handler) {
       mHandler = handler;
}

第二步,在Fragment中的回調函數onAttach()中得到Fragment所在Activity,並調用setHandler方法,設置Handler。該Handler在Fragment中定義,用來接收消息與Fragment進行交互。

@Override
public void onAttach(Activity activity) {
       super.onAttach(activity);
       mActivity = (MainActivity) activity;
       mActivity.setHandler(mHandler);
}

public Handler mHandler = new Handler() {
       public void handleMessage(android.os.Message msg) {
              switch (msg.what) {
                     case 1:
                     text.setText((String) msg.obj);
                     break;
              }
       };
};

然後我們可以在Activity中發送消息給Fragment中的Hanlder進行交互。

public void inter(View view) {
       Message msg = new Message();
       msg.obj = edit.getText().toString();
       msg.what = 1;
       mHandler.sendMessage(msg);
}

第二種

首先我們需要在Activity中動態添加Fragment時,用Bundle封裝我們需要傳遞的數據。

public void button(View view) {
       ArgFragment argFragment = new ArgFragment();
       Bundle bundle = new Bundle();
       bundle.putString("arg", edit.getText().toString());
       argFragment.setArguments(bundle);
       FragmentManager fm = getFragmentManager();
       FragmentTransaction ft = fm.beginTransaction();
       ft.replace(R.id.layout_fragment, argFragment);
       ft.commit();
}

然後在Fragment的回調函數中通過Fragment提供的方法getArguments() 取出Bundle對象。
Bundle bundle = getArguments();

第三種

第一步:我們需要在Fragment中定一個接口,並確保我們的容器Activity實現了此接口:

public interface onTestListener {
       void onTest(String str);
}
@Override
public void onAttach(Activity activity) {
       super.onAttach(activity);
       // 這個方法是用來確認當前的Activity容器是否已經繼承了該接口,如果沒有將拋出異常
       try {
                mCallback = (onTestListener) activity;
       } catch (ClassCastException e) {
               throw new ClassCastException(activity.toString() + " must implement OnHeadlineSelectedListener");
       }
}

第二步:在我們的容器Activity中實現此接口,並實現接口中的方法。

public class MainActivity extends Activity implements onTestListener {

@Override
public void onTest(String str) {
       text.setText(str);
}

第三步:我們在fragment執行某些特定的操作時,調用接口中聲明的方法。

@Override
public void onClick(View v) {
       mCallback.onTest(edit.getText().toString());
}

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