广播接收器和片段

时间:2014-10-28 18:35:26

标签: android android-fragments broadcastreceiver

我实现了这个场景,我有一个带有嵌套片段的导航抽屉,这些片段被添加到带有标记的后台堆栈中。每个片段都实现了以下内容:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (rootView == null) {
        rootView = inflater.inflate(R.layout.fragment_feed, container,
                false);
        // Doing initialisaion here
    } else {
        ((ViewGroup) rootView.getParent()).removeView(rootView);
    }
    return rootView;

这是我认为在这些片段及其动态页眉和页脚中维护我的列表的最佳方式(想想已经在这里实现新方法)。

此外,当用户退出我的应用程序以便刷新这些列表或位置发生变化时,我会收到这些广播:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
            locationBroadcastReciever,
            new IntentFilter(UpdateLocationIntentService.LOCATION_CHANGED));
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
            significantBroadcastReciever,
            new IntentFilter(UserDefaultsManager.SIGNIFICANT_CHANGED));
    // Further code here
}

分离片段时调用on分离:

@Override
public void onDetach() {
    super.onDetach();
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(
            locationBroadcastReciever);
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(
            significantBroadcastReciever);
   // This is also where I cancel any pending request for fetching data
};

这种方式现在正在工作但是我必须检查请求何时完成是否已经销毁了一些视图因为在我用另一个替换片段时调用onDestroyView但是由于片段在后面的堆栈上而没有调用onDetach它尚未超脱。

使用视图nullpointer检查的当前实现允许我在用户注销(或登录)或位置发生更改且列表中先前没有项目时同时更新4个片段。

我确信有更好的方法,但我似乎无法在我尝试过的任何其他方面获得相同的结果。

1 个答案:

答案 0 :(得分:0)

我的情况是更新MainActivity托管的一个片段中的文本字段。我找到的最简单的解决方案是: -

在我的MainActivity类中检索了MainActivtiy的运行实例。这是我的MAinActivity

private static MainActivity mainActivityRunningInstance;
    public static MainActivity  getInstace(){
        return mainActivityRunningInstance;
    }
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainActivityRunningInstance =this;
----------
}

现在在Broadcast reciever的onRecieve方法中,获取该实例并调用更新方法

 @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().matches(Intents.PROVIDER_CHANGED_ACTION)) {
                String textValue="the text field value";
// the null check is for, if the activity is not running or in paused state, in my case the update was required onlyif the main activity is active or paused
            if(MainActivity.getInstace()!=null)
                MainActivity.getInstace().updateUI(textValue);
}

现在我们需要在UIThread中运行更新的部分,MainActivity的updateUI方法将调用片段更新方法。

public void updateUI(final String str) {
        MainActivity.this.runOnUiThread(new Runnable() {
            public void run() {
     //use findFragmentById for fragments defined in XML ((SimpleFragment)getSupportFragmentManager().findFragmentByTag(fragmentTag)).updateUI(str);
            }
        });
    }

,最后一步是更新片段的文本字段

public void updateUI(String str){
        tv_content.setText(str);
    }

和宾果,完成了。我提到post来解决我的问题。希望它能帮到别人。

相关问题