为什么事务管理器会覆盖片段标记

时间:2016-02-17 14:56:11

标签: android android-fragments fragmenttransaction

现在这是学术性的,因为我有一个解决方法。 如果我构建自己的Fragment并在FragmentPagerAdapter's getItem中返回它,一切正常。但我无法控制Fragment的标签。

如果我使用TransactionManager,将其传递给我的Fragment和我自己的标签,那么Android的框架会尝试设置其标签,我会收到错误消息。

  

java.lang.IllegalStateException:无法更改片段的标记   SetupFragment {41f82b08 SetUpTag}:现在是SetUpTag   机器人:切换器:2131427454:0

/**
 * Return the {@link android.support.v4.app.Fragment} to be displayed at {@code position}.
 */
@Override
public Fragment getItem(int i) {
    assert (i >= 0 && i < getCount());


    /** Didn't work. A tag is generated internally and wants to replace mine.
     * TabChanged exception.
     */
    String tag=null;
    switch(i) {
        case 0: tag="SetUpTag";break;
        case 1: tag="StartTag";break;
        case 2: tag="FinishTag";break;
        case 3: tag="SummaryTag";break;
        default: break;
    }

    android.support.v4.app.FragmentTransaction xact = mFm.beginTransaction();
    Fragment fragToReturn =  mFm.findFragmentByTag(tag);
    if(null == fragToReturn) {
        switch(i) {
            case 0: fragToReturn = new SetupFragment();break;
            case 1: fragToReturn = new StartFragment();break;
            case 2: fragToReturn = new FinishLineFragment();break;
            case 3: fragToReturn = new SummaryFragment();break;
            default: break;
        }
        xact.add(fragToReturn, tag);
    }
    xact.commit();
    return fragToReturn;
}

使用事务管理器以这种方式准备片段是错误的吗?

我的工作是在getItem中简单地构造我的片段(没有标记)。 我需要一些方法来重新找到我的碎片。虽然我可以看到标签是如何在内部构建的,但我不愿意依赖它(它可能会改变)。所以我通过覆盖instantiateItem来抓取每个片段的引用。

0 个答案:

没有答案