【问题标题】:FragmentTransaction .attach and .detach for Actionbar tabs用于操作栏选项卡的 FragmentTransaction .attach 和 .detach
【发布时间】:2011-12-22 22:49:58
【问题描述】:

我正在尝试让代码 here 工作。它编译得很好。它会运行。它将加载选项卡 1(共 3 个)。但是,当我单击第二个或第三个选项卡时,我得到了这个:

java.lang.NoSuchMethodError: android.app.FragmentTransaction.detach

这发生在此处的代码中

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    if (mFragment != null) {
        //ft.detach(mFragment); //requires API Level 13
        ft.remove(mFragment); //this does not do the same thing as detach
    }
}

我发现detach 仅适用于 API 级别 13。我尝试了remove,但显然它没有做同样的事情。有没有人根据第一个link 中的代码对如何克服这个问题有任何想法?


编辑: 我猜attach 也是如此,因为它也在代码中,但在应用程序崩溃之前不会受到影响。

【问题讨论】:

    标签: android transactions fragment detach


    【解决方案1】:

    看来,将代码中引用附加和分离的几个地方替换为添加和删除将允许代码在 API 级别 13 之前的环境中正常运行。

        public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
            mArgs = args;
    
            // Check to see if we already have a fragment for this tab, probably
            // from a previously saved state.  If so, deactivate it, because our
            // initial state is that a tab isn't shown.
            mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
            if (mFragment != null) { // && !mFragment.isDetached()) {
                FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
                //ft.detach(mFragment);
                ft.remove(mFragment);
                ft.commit();
            }
        }
    
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            //if (mFragment == null) {
                mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
                ft.add(android.R.id.content, mFragment, mTag);
            //} else {
            //    ft.attach(mFragment);
            //}
        }
    
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                //ft.detach(mFragment); //requires API 13
                ft.remove(mFragment); //this does not do the same thing as detach
            }
        }
    

    【讨论】:

    • 但使用 ft.add/remove 片段状态在选项卡之间切换时会丢失
    【解决方案2】:

    如果您在 API 4+ 兼容包 -android.support.v4.app.FragmentTransaction 中使用 FragmentTransaction - 您应该能够在 API 级别 13 之前的平台上调用附加和分离方法。

    http://developer.android.com/resources/samples/Support4Demos/index.html

    【讨论】:

    【解决方案3】:

    或者只使用http://actionbarsherlock.com/ 从 2.x 开始,您将拥有一致的操作栏体验

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2011-04-07
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多