【问题标题】:Null FragmentTransaction being passed to TabListener.onTabSelected()Null FragmentTransaction 被传递给 TabListener.onTabSelected()
【发布时间】:2012-09-11 02:04:12
【问题描述】:

我正在使用此处提供的示例代码将导航选项卡添加到操作栏: http://developer.android.com/guide/topics/ui/actionbar.html我正在使用 ActionBarSherlock。

我的 TabListener 是直接从文档中复制而来的。

    public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    /** Constructor used each time a new tab is created.
      * @param activity  The host Activity, used to instantiate the fragment
      * @param tag  The identifier tag for the fragment
      * @param clz  The fragment's Class, used to instantiate the fragment
      */
    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (mFragment == null) {
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }
}

我在我的活动中设置了监听器:

    ActionBar.Tab tab = actionBar.newTab();
    tab.setText(getString(R.string.TAB_CALC));
    tab.setTabListener(new TabListener<StrokeSelectorFragment>(this, "blah", StrokeSelectorFragment.class));
    actionBar.addTab(tab);

但应用程序因空指针异常而崩溃,因为空 FragmentTransaction 正在传递给侦听器中的 onTabSelected()。我应该在某个地方创建一个吗?

我一遍又一遍地看文档,我很困惑。你能看到我错过了什么吗?

【问题讨论】:

标签: android


【解决方案1】:

我发现上面 Ollie 的帖子很有帮助,但不够详细。我设法重构了ActionBar Guide 中提供的代码,如下所示(注意:您必须对 TabListener 中实现的其他方法进行相同的更改):

public void onTabSelected(Tab tab, FragmentTransaction ignoredFt) {
    FragmentManager fragMgr = ((FragmentActivity)mActivity).getSupportFragmentManager();
    FragmentTransaction ft = fragMgr.beginTransaction();

    // Check if the fragment is already initialized
    if (mFragment == null) {
        // If not, instantiate and add it to the activity
        mFragment = Fragment.instantiate(mActivity, mClass.getName());

        ft.add(android.R.id.content, mFragment, mTag);
    } else {
        // If it exists, simply attach it in order to show it
        ft.attach(mFragment);
    }
}

【讨论】:

  • 谢谢。有趣的是,起初我忽略了添加 ft.commit 调用而没有明显的后果。
  • 干杯@Boswell,我也错过了,只是感谢您的评论才发现它
  • ft.commit() 是必要的,我不知道为什么(可能是由于 sherlock 的限制)
【解决方案2】:

这似乎是兼容性库的问题(因此关联 ActionBarSherlock)。解决方法是忽略传入的(null)FragmentTransaction,自己获取。这是马克墨菲的一个例子:

        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction ft = fragMgr.beginTransaction();
        ft.commit();

https://groups.google.com/forum/#!msg/android-developers/pCnSx7sTIZ8/cTt1L91M2NgJ

https://groups.google.com/group/actionbarsherlock/browse_thread/thread/89eac58c13fe1ae0

【讨论】:

  • commit() 在这种情况下是必要的吗?医生说“不”,但你说,为什么?在我的测试中,它只适用于 commit()。
【解决方案3】:

我在这里找到了解决方案:https://github.com/JakeWharton/ActionBarSherlock/issues/482

仔细检查您的主机活动是否来自SherlockFragmentActivity

【讨论】:

    【解决方案4】:

    这是 ActionBarSherlock 的错误。由 JakeWharton 在版本 4.0.1 (2012-03-25) 中修复。

    现在 ActionBarSherlock 可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2022-12-12
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2020-02-02
      • 1970-01-01
      相关资源
      最近更新 更多