android - fragment 在 Activity 轮换上重叠

标签 android android-fragments

我对此感到非常困惑。我有一个带列表导航的 actionbar。我点击列表依次打开2个fragment并显示在同一个activity中。我基本上是用这种方法替换它们:

public void openFragment(AprilAppsFragment createdFragment){        
    if (createdFragment.getClass().isInstance(getDisplayedFragment()))
        return;

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    transaction.replace( R.id.main_fragment, createdFragment, "displayed fragment"); 
    transaction.addToBackStack(null);
    transaction.commit();  
}

我打开 fragment A,然后打开 fragment B,然后旋转屏幕。正在重新创建 fragment A 导致我的应用崩溃

为什么会这样,因为我正在使用替换?如何避免重新创建不再显示的 fragment ,同时又不失去对它们进行反压的可能性?

最佳答案

你的问题是你没有为你的 fragment 保存状态,因为你还没有添加

android:configChanges="orientation|screenSize"

您的第一个 fragment 再次被调用,并且由于您没有保存状态,您的应用程序崩溃了。所以最好在 list 中的 Activity 声明中添加上面的行,例如:

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"

并重写 onSaveInstanceState 并保存两个 fragment 的状态。在你的 onCreate 中做这个检查:

if(savedInstanceState != null){
fragmentA = (FragmentA) fragmentManager.getFragment(savedInstanceState, stringValueA);
fragmentB = (FragmentB) fragmentManager.getFragment(savedInstanceState, stringValueB);
}

然后检查您的任何 fragment 是否不为空,然后创建其实例并将其设置为 fragmentTransaction.relplace。或者在您的 for openFragment 方法中执行此操作。

干杯,

关于android - fragment 在 Activity 轮换上重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15074320/

相关文章:

android - Android应用程序组合

android - Android Junit 项目中的日志记录和 Junit 测试问题

Android:Activity.onPause() 之后的点击事件

android - 如何停止在 Android Studio 中构建的 Android 应用程序等待调试器附加?

java - 不兼容的 fragment 类型

在布局之间切换时的 Android 动画剪辑

android - 无法保留嵌套 fragment

java - 从 fragment 调用父 Activity 方法

java - 如何访问Fragment类中的setAdapter?

android - 将 ArrayAdapter<String> 更改为扩展 ArrayAdapter<String> 的自定义适配器时出现错误