我对此感到非常困惑。我有一个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 正在重新创建,导致我的应用崩溃
是什么意思,因为我正在使用替换?如何避免重新创建不再显示的片段,而不会失去对其进行反压的可能性?
答案 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中查找您的片段。