6

我有activity两个fragments。我没有使用<fragment/>标签,我有两个扩展类Fragment,在那个片段中,我有:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.bfragment, container, false); // this will inflate the Fragment in activity.
    }

现在的问题是,我在活动中接收到一些广播接收器,一些接收器从第一个片段更新 UI,一些接收器从第二个片段更新 UI。

我的主要活动中定义的广播接收器之一是:

private BroadcastReceiver bcReceived = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent intent) {
            Log.d("", "BC Object Received");

            ActionBar actionbar = getActionBar();
            actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            ActionBar.Tab bTab = actionbar.newTab().setText("B");
            Fragment fragment = new BFragment();
            bTab.setTabListener(new MyTabsListener(fragment));
            actionbar.addTab(bTab, true);

            final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.bTable);  // Getting null pointer exception here. linearLayout is not getting initialized.

我想使用上面的 linearLayout 并用它来膨胀其中的视图。但是得到NPE。

在这里,当一些广播接收器更新第一个片段时,它可以正常工作,但是当广播接收器从活动更新第二个片段时,我得到 NPE。

我的问题是:我应该如何以及在哪里更新片段?它应该在我的活动中吗?如果是,那么用哪种方法?如果没有,那么我应该在哪里更新片段?

请帮我!!!

4

1 回答 1

26

您的活动逻辑应该与您的片段逻辑分开。

您的活动应该处理如下逻辑:

我需要显示这个片段而不是那个片段

但是您的活动应该处理这种逻辑:

我需要更新片段内的内容

更新其内容是片段的责任。另一方面,活动可能会告诉片段它需要更新自己。

考虑到这一点,您的片段应该公开方法,例如

updateContent(With Blabla)

或者

updateContent()

在您的活动中,当BroadcastReceiver收到一些东西时,您应该:

  • 检查当前显示的是哪个片段
  • 准备片段中要更新的内容
  • 要求片段使用该updateContent(With Blabla)方法进行更新。

或者

  • 检查当前显示的是哪个片段
  • 要求片段使用该updateContent()方法更新自身。

根据你的应用业务逻辑选择最简单的方法。

于 2012-06-12T08:44:02.360 回答