安卓屏幕旋转后片段停留在活动中的问题

5

我有两个 activity_main.xml 的变体(用于纵向/横向方向)。在此活动中,用户可以选择项目并浏览所选项目的详细信息。

在纵向方向中,片段会动态添加到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>

这里是MainActivity的onCreate()方法的代码:

@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个回答

1
我看到至少有两种方法可以实现您想要的功能。 自己处理屏幕方向变化:this document所述,您可以防止自动销毁和重新创建Activity,并自己处理屏幕方向变化。在这种情况下,在为Activity充气新布局之前,您需要删除旧的Fragment。 在Activity重新创建后删除旧的Fragment: 您还可以添加一些逻辑来确定方向,如here所述(或使用当前设置isDynamicMode的启发式算法),并在onCreate()期间手动删除不必要的Fragments。 更好的方法: 尽管您想要的是可能可以实现的,但我不明白为什么您希望以这种方式来做 - 您在纵向和横向配置中都使用了 TaskListFragment,因此最合理的做法是重用它。除了简化事情之外,这还将使您在方向更改时保留该Fragment的状态(我相信,在您的情况下这是可取的)。

0
感谢Vasiliy的回答。我按照这个链接并在我的清单文件中添加了

android:configChanges="oritentation"


<activity android:name=".MyActivity"
      android:configChanges="orientation"
      android:label="@string/app_name">

当屏幕旋转时,碎片未附加到活动的烦人行为消失了


-2
只需在您的活动中添加以下代码:
``` @Override public void onSaveInstanceState(Bundle outState) {} ```
因为在 Android 的 Activity 中实现了此方法,它是所有 Activities 的父类,可以保存 Fragment。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接