我正在处理Fragment交易。我从主要活动的homepage_fragment
开始,然后转到second fragment
,但是当回到'homepage_fragment'时,我收到错误(如下所示)。我想回到homepage_fragment
的同一个实例而不是新实例。
移动到change_fragment
时会调用second fragment
方法,而当移动到其他方式时调用change_fragment2
。
Fragment homepage_fragment = new HomePageFragment();
getFragmentManager().beginTransaction().add(R.id.activity_main, homepage_fragment,"homepage_fragment").commit();
这些是主要活动中实现的接口方法。
@Override
public void change_fragment(){
final FragmentTransaction ft = getFragmentManager().beginTransaction();
String tag = "homepage_fragment";
Fragment newFragment = new SecondFragment();
ft.replace(R.id.activity_main, newFragment);
ft.addToBackStack(tag);
ft.commit();
}
@Override
public void change_fragment2() {
final FragmentTransaction ft = getFragmentManager().beginTransaction();
//String tag1 = getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1).getName();
String tag1 = "second_fragment";
int lastFragCount = getFragmentManager().getBackStackEntryCount() -1;
String fragName= getFragmentManager().getBackStackEntryAt(lastFragCount).getName();
Fragment newFragment = getFragmentManager().findFragmentByTag(fragName);
ft.replace(R.id.activity_main, newFragment , tag1);
ft.addToBackStack(tag1);
ft.commit();
}
这是我得到的错误:
FATAL EXCEPTION: main
Process: com.example.user.popupwindowdemo, PID: 10309
java.lang.IllegalStateException: Can't change tag of fragment HomePageFragment{2141e52a #0 id=0x7f0c006f homepage_fragment}: was homepage_fragment now second_fragment
因为,在replace
方法中传递的标记名称是标记当前片段,我不认为我在这里更改任何片段的标记名称。所以,他们应该保持不变。
调试时,findFragmentByTag()
返回的对象引用是正确的,但它会在下一个语句后返回错误。我无法清楚地理解这里出了什么问题。有人能告诉我问题是什么吗?
答案 0 :(得分:0)
您实际上从未创建过新的Fragment
。这个方法:
Fragment newFragment = getFragmentManager().findFragmentByTag(fragName);
只是在后台堆栈中找到最后一个Fragment
,然后您尝试将Fragment
替换为自己。
创建片段后堆栈的常规方法是添加一个像这样的片段:
@Override
public void addFragment(String tag, Fragment fragment) {
getFragmentManager().beginTransaction()
.add(R.id.activity_main, fragment)
.addToBackStack(tag)
.commit();
}
然后您可以删除最后一个Fragment
:
@Override
public void removeFragment() {
getFragmentManager().popBackStack();
}