2

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

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

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
    }

}
4

2 回答 2

2

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

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

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

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

希望这可以帮助。

于 2013-02-12T15:16:24.757 回答
1

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

BroadcastReceiver onReceive()方法被调用时,将一个作为指示标志添加boolean到Fragment 应该做的事情,并在 Fragment 方法中根据方法中的集合执行所需的逻辑。SharedPreferencesonResume()SharedPreferences booleanBroadcastReceiver onReceive()

尽管有更好的做法,但我没有在长期运行的应用程序上测试这种方法。

于 2014-07-23T21:16:01.393 回答