片段与活动轮换重叠

时间:2013-02-25 18:57:03

标签: android android-fragments

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

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 ,然后我旋转屏幕。片段 A 正在重新创建,导致我的应用崩溃

是什么意思,因为我正在使用替换?如何避免重新创建不再显示的片段,而不会失去对其进行反压的可能性?

5 个答案:

答案 0 :(得分:9)

您的问题是您没有保存片段的状态,因为您还没有添加

android:configChanges="orientation|screenSize"

再次调用您的第一个片段,因为您没有保存状态,您的应用程序崩溃了。因此,您可以在清单中的活动声明中添加上面的行,例如:

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

并覆盖onSaveInstanceState并保存两个片段的状态。在你的onCreate中,只需进行检查:

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

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

干杯,

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

@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());
}

答案 3 :(得分:1)

我遇到了类似的问题,我的工作是在我的网站上添加一个代码行 Androidmanifest.xml(在您想要停止重新创建的活动中):

  

机器人:configChanges = “取向”

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

我希望我帮助你...

答案 4 :(得分:1)

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

android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"

这将使活动不再重新启动,FragmentManager会自动重新创建它所拥有的片段。

如果您需要在旋转时重新启动活动,那么您必须查找传递给onCreate的savedInstanceState,然后使用您提供的标签在FragmentManager中查找您的片段。