【问题标题】:update fragment ui based off of Activity's Broadcast Receiver根据 Activity 的广播接收器更新片段 ui
【发布时间】:2013-02-12 15:06:32
【问题描述】:

首先让我说我已经阅读了许多与 SO 上的片段相关的问题。但是,我似乎找不到与我完全相同的情况。

我有使用 PageAdapter 的 myActivity,每个页面都是一个片段。我还有一个服务,它接收有关网络连接等的更新。该服务触发 myActivity 中的接收器。 myActivity 需要更新 FragmentPage1 但因为我正在使用 pageAdapter 并在运行时创建我的片段,所以我无法“findFragmentbyId”等。我不需要传递任何数据,我只需要触发 FragmentPage1 类中的函数。请看下面的代码 sn-p。

public class myActivity extends FragmentActivity implements ViewPager.OnPageChangeListener {

    FragmentManager fm = getSupportFragmentManager();
    mPagerAdapter = new PagerAdapter(fm);
    mPager.setAdapter(mPagerAdapter);
    mPager.setOnPageChangeListener(this);

    // add tabs. Use ActionBar for 3.0 and above, otherwise use TabWidget
    final ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    bar.addTab(bar.newTab()
            .setText(R.string.fragment_page_1)
            .setTabListener(new ActionBarTabListener(mPager)));
    bar.addTab(bar.newTab()
            .setText(R.string.fragment_page_2)
            .setTabListener(new ActionBarTabListener(mPager)));

     private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive (Context context, Intent intent){
                 if(intent.getAction().equals(InterfaceManager.BROADCAST_UPDATE_CONNECTION_STATS)) { 
                     updateFragmentPage2();
                 } else if (intent.getAction().equals(InterfaceManager.BROADCAST_UPDATE_RULES)) {
                     UpdateFragmentPage1();
                 }
            }
     };
}


public class FragmentPage2 extends Fragment implements OnCheckedChangeListener, OnClickListener  {
    public void UpdateFragmentPage2() {
        //update list view
    }

}

【问题讨论】:

    标签: android android-fragments broadcastreceiver android-service


    【解决方案1】:

    根据您的代码,您可以快速执行以下操作。

    int tabIndex = 0;
    MyCustomFragment frag = getFragmentManager().findFragmentByTag(getActionBar().getTabAt(tabIndex).getText().toString());
    frag.updateFragmentContent();
    

    创建一个自定义基础片段 MyCustomFragment 并拥有一个抽象方法 updateFragmentContent(),然后您只需要更改选项卡索引,无需特殊类型转换

    请注意,以上是一种更简洁的方法。使用您现有的代码,您仍然可以有两个单独的类型转换并调用两个单独的方法来更新相应的片段。

    希望这会有所帮助。

    【讨论】:

    • 所以当我尝试上面的代码时,它总是为片段返回 null 。在推断参数列表中的片段后,它在 getText().toString() 部分失败,我能够获得 fm 和 actionBar.tab。此外,您能否详细说明您建议使用带有抽象方法的基本片段的另一部分。这不会引入同样的问题,但只是在基片段类级别?
    • getTab().getText() 应该为您返回所选选项卡的标题文本,由于您正确设置选项卡标题,我真的不知道,在检索它时可能有什么问题.您是否尝试过单步调试器,以查看与标记关联的文本是什么。这可能是因为您使用资源 ID 来设置选项卡文本。或者,您可以执行 tab.setTag() 和 tab.getTag() 来获得相同的结果。
    • 谢谢!只需将 .setTag() 添加到声明中!
    【解决方案2】:

    由于BroadcastReceiverFragmentActivity 之间的复杂通信,我遇到了类似的问题并选择摆脱这种扭曲,并使用了以下内容:

    当调用BroadcastReceiver onReceive() 方法时,将boolean 添加到SharedPreferences 作为片段应该做某事的指示标志,并在片段onResume() 方法中基于SharedPreferences booleanBroadcastReceiver onReceive() 方法中设置。

    请注意,虽然有更好的做法,并且 我没有在长期运行的应用程序中测试这种方法。

    【讨论】:

    • 能否请您提及一些其他更好的方法?
    猜你喜欢
    • 2020-07-28
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多