popbackstack 后片段不可见
Fragment is not visible after popbackstack
我在 Activity.onCreate()
中添加了片段(主页片段),但没有将其添加到后台堆栈,我使用 FragmentTransaction.replace()
进行了添加。之后,我使用 FragmentTransaction.replace()
添加每个下一个片段并将其添加到后台。
我有一个功能可以清除后台堆栈,让主页片段可见,为此我使用 FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
。
如果我只添加 1 个片段到 backstack 然后清除 backstack 它工作正常,但如果我添加多个然后在清除 backstack 后屏幕是空白的,尽管主片段接收 onStart() 和 onResume( ) 并认为它是可见的,它不会收到 onPause()、onStop(),直到我再次添加另一个片段或离开应用程序。
另外,如果我 popBackstack()
一个一个(根据用户操作)它工作正常,但如果我 popBackstack()
在循环中(一次弹出所有片段)它不起作用。
代码如下:
public void changeFragment(BaseFragment fragment, boolean addToBackStack, boolean preventDuplicate) {
Fragment topFragment = getSupportFragmentManager().findFragmentById(fragmentContainer.getId());
if (preventDuplicate && topFragment != null && fragment.getClass().equals(topFragment.getClass())) {
//Prevent adding same fragment
return;
}
FragmentTransaction transaction =
fragmentManager
.beginTransaction()
.replace(fragmentContainer.getId(), fragment);
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
public void goToHome() {
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
原来新的支持库版本搞砸了。更改后
compile 'com.android.support:appcompat-v7:25.1.1'
回到
compile 'com.android.support:appcompat-v7:25.0.1'
一切正常
有一个新的 FragmentTransaction 方法(在版本 25.1.0 中添加)参见:https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#setAllowOptimization(boolean)。
尝试在 FragmentTransaction 上设置此项,同时 :
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setAllowOptimization(true);
transaction.replace(...);
这解决了我的问题。
感谢:
我在 Activity.onCreate()
中添加了片段(主页片段),但没有将其添加到后台堆栈,我使用 FragmentTransaction.replace()
进行了添加。之后,我使用 FragmentTransaction.replace()
添加每个下一个片段并将其添加到后台。
我有一个功能可以清除后台堆栈,让主页片段可见,为此我使用 FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
。
如果我只添加 1 个片段到 backstack 然后清除 backstack 它工作正常,但如果我添加多个然后在清除 backstack 后屏幕是空白的,尽管主片段接收 onStart() 和 onResume( ) 并认为它是可见的,它不会收到 onPause()、onStop(),直到我再次添加另一个片段或离开应用程序。
另外,如果我 popBackstack()
一个一个(根据用户操作)它工作正常,但如果我 popBackstack()
在循环中(一次弹出所有片段)它不起作用。
代码如下:
public void changeFragment(BaseFragment fragment, boolean addToBackStack, boolean preventDuplicate) {
Fragment topFragment = getSupportFragmentManager().findFragmentById(fragmentContainer.getId());
if (preventDuplicate && topFragment != null && fragment.getClass().equals(topFragment.getClass())) {
//Prevent adding same fragment
return;
}
FragmentTransaction transaction =
fragmentManager
.beginTransaction()
.replace(fragmentContainer.getId(), fragment);
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
public void goToHome() {
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
原来新的支持库版本搞砸了。更改后
compile 'com.android.support:appcompat-v7:25.1.1'
回到
compile 'com.android.support:appcompat-v7:25.0.1'
一切正常
有一个新的 FragmentTransaction 方法(在版本 25.1.0 中添加)参见:https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#setAllowOptimization(boolean)。
尝试在 FragmentTransaction 上设置此项,同时 :
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setAllowOptimization(true);
transaction.replace(...);
这解决了我的问题。
感谢: