Android 活动旋转上的片段重叠

Android 活动旋转上的片段重叠,android,android-fragments,Android,Android Fragments,我真的很困惑。我有一个带有列表导航的actionbar。我点击列表,依次打开2个片段,并显示在同一活动中。我基本上是用这种方法替换它们: public void openFragment(AprilAppsFragment createdFragment){ if (createdFragment.getClass().isInstance(getDisplayedFragment())) return; FragmentManager mana

我真的很困惑。我有一个带有列表导航的
actionbar
。我点击列表,依次打开2个
片段
,并显示在同一活动中。我基本上是用这种方法替换它们:

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();  
}
我打开片段A,然后打开片段B,然后旋转屏幕。碎片正在重新创建一个,使我的应用程序崩溃


为什么,既然我用的是替换?如何避免重新创建不再显示的片段,而不丢失对其进行反压的可能性?

片段在旋转时自动保存其状态(以及在后堆栈上的位置)。确保您没有在onActivityCreated或onCreate方法中重新创建片段或调用openFragment。

我也有类似的问题,我要做的是在我的 Androidmanifest.xml(在您要停止重新创建的活动中):

android:configChanges=“方向”

还有一件事,我知道碎片是一种子活动,不是活动, 我们必须扩展一个活动片段以获得对片段的支持,而扩展该活动片段的活动实际上是包含称为片段的“子活动”的活动


希望我能帮助您……

将此添加到AndroidManifest.xml文件中的活动定义中:

android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"
这将防止活动重新启动,并防止FragmentManager自动重新创建其拥有的片段


如果需要在rotate时重新启动活动,则必须查找正在传递到onCreate的savedInstanceState,然后使用您提供的标记向FragmentManager查询您的片段。

您的问题是活动正在重新创建,这会导致您重新设置列表导航,这将导致触发默认(第一)位置。您需要在活动销毁和活动重新创建之间保存所选索引。下面是一个例子:

@Override
public void onCreate(Bundle savedInstanceState) {

    // onCreate implementation...

    // Must come after setListNavigationCallbacks is called
    if (savedInstanceState != null) {
        int index = savedInstanceState.getInt("index");
        getActionBar().setSelectedNavigationItem(index);
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);
    outState.putInt("index", getActionBar().getSelectedNavigationIndex());
}

您的问题是您没有保存片段的状态,并且由于您没有添加

android:configChanges="orientation|screenSize"
您的第一个片段再次被调用,由于您没有保存状态,您的应用程序崩溃。因此,最好在清单中的活动声明中添加上面的行,如:

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"
然后检查是否有任何片段不为null,然后创建其实例并将其设置为fragmentTransaction.relplace。或者在for openFragment方法中执行此操作


干杯,

您能添加崩溃时的堆栈跟踪吗?这与此无关。当片段试图用数据填充其内容时,会发生崩溃,但它无法实例化视图组件,因为它甚至没有显示。您是否从
OnNavigationListener
调用该方法?如果是,请记住监听器将由活动创建/重新创建触发。语句
If(createdFragment.getClass().isInstance(getDisplayedFragment())返回非常可疑。你能给我们看一下堆栈跟踪吗?堆栈跟踪从来都不是无关的。因此,创建片段A和片段B(即调用此openFragment方法)的唯一位置是列表的单击方法中?确切地说,这是唯一一个位置。它没有真正回答为什么“娱乐活动”会重新创建所有片段,甚至那些被替换的片段。configChanges实际上停止了活动,但它与ActionBar不起作用Sherlock和my仅在post ICS系统上值得一试在这个线程中阅读答案:这样一个令人恼火的问题不太常见,只需一行代码就可以解决,但就这样了。谢谢,阿利尔。
if(savedInstanceState != null){
fragmentA = (FragmentA) fragmentManager.getFragment(savedInstanceState, stringValueA);
fragmentB = (FragmentB) fragmentManager.getFragment(savedInstanceState, stringValueB);
}