Android系统。屏幕旋转问题

时间:2016-09-04 18:14:11

标签: android android-layout android-fragments android-lifecycle

我有 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(),...中获得两次创建方法调用,)。这表示旧片段保持活动状态并在方向更改时重新创建。 我怎么能最终摧毁旧片段?我没有在互联网上找到答案。

P.S:抱歉我的英语不好......

3 个答案:

答案 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。