我有 activity_main.xml 的两种变体(用于纵向/横向)。在此活动中,用户可以选择项目并浏览有关所选项目的详细信息。
在portraint方向中,片段在项目选择后动态添加到 flFragmentContainer ,详细信息片段替换列表片段:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/flFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
</LinearLayout>
在横向方向上,静态描述XML文件中的片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<fragment
android:id="@+id/frgTaskList"
android:name="com.exprod.xchecklist.fragments.TaskListFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
tools:layout="@layout/fragment_task_list" />
<fragment
android:id="@+id/frgTaskDetails"
android:name="com.exprod.xchecklist.fragments.TaskDetailsFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
tools:layout="@layout/fragment_task_details">
</fragment>
</LinearLayout>
</LinearLayout>
这是onCreate()方法(MainActivity)的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
TaskDetailsFragment taskDetailsFragment = (TaskDetailsFragment)fragmentManager.findFragmentById(R.id.frgTaskDetails);
isDynamicMode = taskDetailsFragment == null || !taskDetailsFragment.isInLayout();
if(isDynamicMode){
FragmentTransaction transaction = fragmentManager.beginTransaction();
Fragment taskListFragment = new TaskListFragment();
if (savedInstanceState == null) {
transaction.add(R.id.flFragmentContainer, taskListFragment, TaskListFragment.FRAGMENT_TAG);
}else{
transaction.replace(R.id.flFragmentContainer, taskListFragment, TaskListFragment.FRAGMENT_TAG);
}
transaction.commit();
}
}
问题:当我将设备旋转到横向时,我会在第一个片段(TaskListFragment)( onCreateView(),onActivityCreated(),...中获得两次创建方法调用,/ em>)。这表示旧片段保持活动状态并在方向更改时重新创建。 我怎么能最终摧毁旧片段?我没有在互联网上找到答案。
P.S:抱歉我的英语不好......答案 0 :(得分:2)
我看到至少有两种方法可以做你想做的事。
处理方向更改:
如this document中所述,您可以阻止自动Activity
销毁和重新创建,并自行处理方向更改。在这种情况下,您需要先移除旧的Fragment
,然后再将新布局展示为Activity
。
在重新创建活动后删除旧片段:
您还可以添加一些逻辑来确定here所描述的方向(或使用您设置isDynamicMode
的当前启发式方法),并在{{1}期间手动删除不必要的Fragments
}。
更好的方法:
虽然可以做你想做的事情,但我不能理解你为什么要这样做 - 你在纵向和横向配置中使用onCreate()
,因此最合乎逻辑的做法是重用它。除了简化之外,它还会让你保持TaskListFragment
关于方向变化的状态(我相信,在你的情况下,这是可取的)。
答案 1 :(得分:0)
感谢Vasiliy的回答。我遵循此link 并添加
android:configChanges =“ oritentation”
到我的清单文件:
<activity android:name=".MyActivity"
android:configChanges="orientation"
android:label="@string/app_name">
并且屏幕旋转时的烦人行为(片段未附加到活动中)消失
答案 2 :(得分:-2)
只需添加到您的活动中即可
@Override
public void onSaveInstanceState(Bundle outState) {}
因为在Android的Activity中实现了这个方法,它是所有活动的父级,保存了Fragment。