4

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

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 ,使我的应用程序崩溃

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

4

5 回答 5

9

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

android:configChanges="orientation|screenSize"

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

<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。或者在您的 for openFragment 方法中执行此操作。

干杯,

于 2013-03-08T01:32:50.450 回答
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());
}
于 2013-03-07T07:13:46.793 回答
2

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

于 2013-02-25T19:13:35.533 回答
1

我有一个类似的问题,我要做的是在我的 Androidmanifest.xml 中添加一个代码行(在你想要停止重新创建的活动中):

android:configChanges="方向"

还有一件事,我了解到片段是一种子活动而不是活动,我们必须扩展一个活动片段以获得片段的支持,扩展活动片段的活动是实际持有的活动称为片段的“子活动”。

我希望我能帮助你...

于 2013-03-04T23:43:29.963 回答
1

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

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

这将阻止活动重新启动,并且 FragmentManager 不会自动重新创建它拥有的片段。

如果您需要在轮换时重新启动活动,那么您必须查找已传递给 onCreate 的 savedInstanceState,然后使用您提供的标签查询 FragmentManager 以获取您的片段。

于 2013-03-06T20:18:04.813 回答