基于Activity的广播接收器更新片段ui

时间:2013-02-12 15:06:32

标签: android android-fragments broadcastreceiver android-service

首先让我说我已经阅读了许多与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
    }

}

2 个答案:

答案 0 :(得分:2)

根据您的代码,以下是您可以快速完成的工作。

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

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

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

希望这有帮助。

答案 1 :(得分:1)

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

调用BroadcastReceiver onReceive()方法时,向boolean添加SharedPreferences作为片段应该执行某些操作的指示标记,并在片段{{1 }}方法根据onResume() SharedPreferences方法中设置的boolean BroadcastReceiver执行所需的逻辑。

虽然知道有更好的做法,但我没有在长期运行的期限申请中测试这种方法。