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


最近的这几篇博文都是网上找的,感觉很有用,就转载了,我都表明出处了,若被原创作者发现,无疑冒犯。侵删。

场景: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);
}

//原创作品,未经允许禁止转载,转载请注明来自: 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,欢迎朋友们留言交流~

**************************************正文:*****************************************





猜你喜欢

转载自blog.csdn.net/easy_purple/article/details/80954070