FragmentTransaction中的.attach和.detach用于Actionbar选项卡。

10

我正在尝试让这里的代码工作。它可以编译通过,可以运行,并且可以加载3个标签页中的第1个。但是,当我点击第2个或第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 Level 13。我尝试了remove,但显然它并不起作用。有没有人根据第一个link中的代码有任何想法可以克服这个问题?


编辑: 我猜attach也是在代码中,但在应用程序崩溃之前没有被命中。

3个回答

13

看起来,将代码中引用附加和解除附加的多个位置替换为添加和删除将允许代码在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
        }
    }

4
使用ft.add/remove片段时,在选项卡之间切换会丢失状态。 - Arvis

2

相关博客文章:适用于所有人的片段 - blahdiblah

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接