【问题标题】:Broadcast receivers and Fragments广播接收器和片段
【发布时间】:2014-10-28 18:35:26
【问题描述】:

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

@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 detach:

@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 个片段。

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

【问题讨论】:

  • 看起来你可以从 EventBus 中受益
  • 或者您可以尝试使用 Otto 来替代 EventBus。
  • 感谢您的建议。我不认为我们走在正确的轨道上。事件通过我的片段传播(这不是问题)。我通过设置一个标志做了一个更好的解决方法,以便需要更新片段,并且每当调用 onResume 时我都会进行刷新(这样我就不必担心我的视图为空)。
  • 它解决了我的问题,但如果活动处于活动状态,它不会更新,我的意思是没有暂停。

标签: android android-fragments broadcastreceiver


【解决方案1】:

我的情况是更新 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;
----------
}

现在在广播接收者的 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方法会调用fragments更新方法。

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 来解决我的问题。希望对其他人有所帮助。

【讨论】:

  • 将 Activity 类设为静态绝不是一个好主意...这不是好的架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
相关资源
最近更新 更多