zxd_72
zxd_72
采纳率78.8%
2013-05-23 02:38

activity 旋转时 Fragment 重叠

已采纳

我在程序中设置了一个 actionbar,在 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然后就不再显示?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • hxn_217 hxn_217 8年前

    你的问题是没有为 fragments 保存状态,因为你没有添加android:configChanges="orientation|screenSize"
    因为你没有保存的状态应用程序崩溃,第一个 fragment 又调用一次。所以要在 manifest 中添加:

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

    重写 onSaveInstanceState 方法,保存 fragments的状态。
    在 onCreate 中添加:

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

    然后检查 fragment 是否为空,然后创建它的实例,在 fragmentTransaction.relplace 中设置,或者在 openFragment 方法中设置。

    点赞 1 评论 复制链接分享
  • hadues 技术宅星云 6年前

    你的问题是没有为 fragments 保存状态,因为你没有添加android:configChanges="orientation|screenSize"。
    因为你没有保存的状态应用程序崩溃,第一个 fragment 又调用一次。所以要在 manifest 中添加:

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

    感谢 hxn_217的回答,我今天也遇到了这个问题

    不过我只修改了AndroidManifest.xml中添加了

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

    并没有使用后面的步骤,也成功了。

    点赞 评论 复制链接分享

为你推荐