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種形式