zxd_72 2013-05-23 02:38 采纳率: 0%
浏览 5678
已采纳

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 2013-05-27 03:27
    关注

    你的问题是没有为 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条)

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办