android 基礎問題錦記(1)fragment之間傳遞數據的3種方式

fragment之間傳遞數據的方式?

有3種方式:
情景:創建兩個Fragment,MenuFragment和MainFragment ;MenuFragment對應一個佈局爲一個listview顯示適配item條目,MainFragment 對應就是一個textView 顯示如下:
這裏寫圖片描述
需求:我們點擊上面圖片中展示的對應的條目數據,讓右側(黃色按鈕)對應的文本數據更換成條目展示的文本,例如:我點擊左側第4個條目,右側按鈕文本立馬更改成“這是第4條數據”,從而實現Fragment之間數據的傳遞。下面開始介紹三種方法實現Fragment之間數據的傳遞。
方法一:
1、在MainFragment中設置一個setData()方法,在方法中設置更改按鈕名稱;

//MainFragment.java文件中
public void setData(String string) {
  text_main.setText(string);
}

2、在MenuFragment中的ListView條目點擊事件中通過標籤獲取到MainFragment,並調用對應的setData()方法,將數據設置進去,從而達到數據傳遞的目的。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        MainFragment mainFragment =
             (MainFragment) getActivity()
             .getSupportFragmentManager()
             .findFragmentByTag("mainFragment");
        mainFragment.setData(mDatas.get(position));
   }
});

方法二:
採取接口回調的方式進行數據傳遞。
1: 在Menuragment中創建一個接口以及接口對應的set方法:

//MenuFragment.java文件中
public interface OnDataTransmissionListener {
  public void dataTransmission(String data);
}
public void setOnDataTransmissionListener(OnDataTransmissionListener mListener) {
  this.mListener = mListener;
}

2: 在MenuFragment中的ListView條目點擊事件中進行接口進行接口回調

//MenuFragment.java文件中
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      /**
       * 方法二:採取接口回調的方式進行數據傳遞
       */
      if (mListener != null) {
          mListener.dataTransmission(mDatas.get(position));
      }
  }
});

3: 在MainActivity中根據menuFragment獲取到接口的set方法,在這個方法中進行進行數據傳遞,具體如下:

//在MainActivity.java中
menuFragment.setOnDataTransmissionListener(new MenuFragment.OnDataTransmissionListener() {
  @Override
  public void dataTransmission(String data) {
      mainFragment.setData(data);  //注:對應的mainFragment此時應該要用final進行修飾
  }
});

方法三:
使用三方開源框架:EventBus
https://juejin.im/entry/570ae5668ac247004c3128a4
1:引入EventBus

compile 'org.greenrobot:eventbus:3.0.0'

2:註冊事件接收者
這裏MainFragment是要接收MenuFragment發送來的數據,所以我們在MainFragment中的onCreateView()方法中進行註冊:

EventBus.getDefault().register(this);

3:發送事件
注:發送事件之前其實還有一步定義事件類型,這裏我們傳遞的數據只有一個類型,所以這一步取消了。
MenuFragment發送數據給MainFragment,所以我們在MenuFragment中將要傳遞的數據進行發送事件操作:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      EventBus.getDefault().post(mDatas.get(position));
  }
});

4:接收消息並處理
在MainFragment中我們接收來自MenuFragment傳遞過來的數據,並進行對應的處理(注:EventBus 3.0版本這一步必須要寫註解@Subscribe (與2.4版本有所區別)):

@Subscribe
public void onEvent(String data) {
  bt_main.setText(data);
}

5:註銷事件接收

//MainFragment.java中
@Override
public void onDestroy() {
  super.onDestroy();
  EventBus.getDefault().unregister(this);
}

項目地址:D:\一些功能性工程\Fragment傳遞參數的3種形式

發佈了64 篇原創文章 · 獲贊 28 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章