现在这是学术性的,因为我有一个解决方法。
如果我构建自己的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
来抓取每个片段的引用。