我有setRetainInstance(true)的片段,并在首次启动后尝试查找我的片段。
private void showHomeFragment() {
mHomeFragment = (HomeFragment) getSupportFragmentManager().findFragmentByTag(HomeFragment.class.getSimpleName());
if (mHomeFragment == null) {
mHomeFragment = new HomeFragment();
}
showFragment(mHomeFragment, false);
}
@Override
public void showFragment(Fragment fragment, boolean addToBackStack) {
@SuppressLint("CommitTransaction") FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction()
.replace(R.id.main_container,
fragment,
fragment.getClass().getSimpleName());
if (addToBackStack) {
transaction.addToBackStack(fragment.getClass().getSimpleName());
}
transaction.commit();
getSupportFragmentManager().executePendingTransactions();
}
我启动这个HomeFragment而不是转到另一个片段,而不是回到HomeFragment,我无法通过标签找到它。有人可以帮我弄清问题是什么吗?
提前致谢!
答案 0 :(得分:1)
您正在将addToBackStack
参数设置为false
,而不是将替换操作放在后端堆栈上。因此,FragmentManager
可能会释放对片段的引用,因为它不必撤消该事务,因此没有理由不再保留片段。我必须尝试一下才能确定,但我非常确信这是发生了什么。
为了清楚起见,setRetainInstance(true)
与此逻辑无关。这样做是为了防止碎片被破坏然后在配置更改时重新创建。一旦你替换了HomeFragment
并且它不在后面的堆栈上,那么让FragmentManager
保留该片段是没有意义的。