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