平時項目中遇到一個問題:在子fragment中刷新父fragment的界面,通俗的說也就是在任何一個fragment中來刷新另一個fragment。大家都知道activity和fragment之間的交互可以通過接口回調和bundle來實現,但是這種fragment之間的實時刷新就有些困難了。
原創作品,未經允許禁止轉載,轉載請注明來自:http://www.cnblogs.com/jiangbeixiaoqiao/
經過上網查閱,目前網上還沒有比較靠譜全面有效的方式來實現,基本都是通過activity作為中間媒介進行傳值,但是這會遇到一個問題,就是activity—>fragment傳值時fragment是都新加的(add或者repalce),並不是之前就存在的fragment,所以與我所講的不是一回事。這里講的是所有的fragment都是加載完畢的,存在回退棧中,來實時刷新回退棧中的fragment。話不多說,上代碼,主要實現原理是通過安卓的廣播機制來實現的。
首先,在需要進行刷新更新UI的fragment中注冊廣播接收器:
/**
* 注冊廣播接收器
*/
private void registerReceiver() {
broadcastManager = LocalBroadcastManager.getInstance(getActivity());
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("jerry");
broadcastManager.registerReceiver(mAdDownLoadReceiver, intentFilter);
}
//原創作品,未經允許禁止轉載,轉載請注明來自:http://www.cnblogs.com/jiangbeixiaoqiao/
private BroadcastReceiver mAdDownLoadReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String change = intent.getStringExtra("change");
if ("yes".equals(change)) {
// 這地方只能在主線程中刷新UI,子線程中無效,因此用Handler來實現
new Handler().post(new Runnable() {
public void run() {
//在這里來寫你需要刷新的地方
//例如:testView.setText("恭喜你成功了");
}
});
}
}
};
/**
* 注銷廣播
*/
@Override
public void onDetach() {
super.onDetach();
broadcastManager.unregisterReceiver(mAdDownLoadReceiver);
}
在需要進行刷新更新UI的fragment中的onCreate方法中進行廣播的注冊:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = (MainActivity) getActivity();
//注冊廣播 registerReceiver(); }
在子fragment中發送廣播來實現刷新另一個fragment,這里我用button的點擊來舉例:
btn_change.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
//本文來自原創:http://www.cnblogs.com/jiangbeixiaoqiao/
Intent intent = new Intent("jerry"); intent.putExtra("change", "yes"); LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent); } });
至此,就實現了所說的任意fragment之間進行刷新,只需要在需要刷新的fragment中注冊一個廣播即可,簡單吧。PS:只要廣播監聽器
intentFilter.addAction("jerry");一樣,就可以實現一次刷新多個fragment,歡迎朋友們留言交流~
感覺有用的朋友動動您的小手推薦一下,非常感謝。
原創作品,未經允許禁止轉載,轉載請注明來自:http://www.cnblogs.com/jiangbeixiaoqiao/