通过安卓的广播机制来实现安卓任意两个或多个Fragment之间的交互与刷新界面

xiaoxiao2021-02-28  32

本文转自https://www.cnblogs.com/jiangbeixiaoqiao/p/6214557.html

场景:Afragment跳转到Bfragment后,Bfragment进行了数据操作,返回Afragment,需要自动的对Afragment进行刷新。通过广播来进行消息传输,即Bfragment更新操作后,发送一条广播,Afragment接受到广播,进行自己的更新操作。

 

平时项目中遇到一个问题:在子fragment中刷新父fragment的界面,通俗的说也就是在任何一个fragment中来刷新另一个fragment。大家都知道activity和fragment之间的交互可以通过接口回调和bundle来实现,但是这种fragment之间的实时刷新就有些困难了。

经过上网查阅,目前网上还没有比较靠谱全面有效的方式来实现,基本都是通过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); } 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,欢迎朋友们留言交流~

转载请注明原文地址: https://www.6miu.com/read-2627068.html

最新回复(0)