Android Fragments 在横向模式中添加的片段仍然保留在纵向模式中

g9icjywg  于 2023-04-30  发布在  Android
关注(0)|答案(1)|浏览(90)

我创建了一个Activity,其中一个片段处于纵向模式,两个片段处于横向模式。当在肖像模式,如果我检查

FragmentManager fm = getSupportFragmentManager();
Fragment tt=fm.findFragmentById(R.id.one);

由于www.example,它返回了预期的null www.example.com 。但是当我将移动的切换到横向时,它会像预期的那样显示片段,我可以在片段的视图上工作。然而,如果我从风景切换回肖像,它仍然找到片段一,但无法与其意见。请更新为什么它显示碎片一,当我们回来从风景到肖像和如何处理它。

ggazkfy8

ggazkfy81#

根据所提供的信息,您遇到的问题可能与片段的生命周期以及如何将其添加到Activity有关。
当您从纵向模式切换到横向模式时,会重新创建Activity,FragmentManager会将两个Fragments添加到Activity中。当您切换回纵向模式时,将再次重新创建Activity,并且FragmentManager尝试将两个Fragments添加到Activity中。然而,由于只有一个片段打算在纵向模式下显示,因此FragmentManager添加第一个片段并忽略第二个片段。
要正确处理Activity中Fragments的生命周期,您应该创建两个单独的布局文件-一个用于纵向模式,一个用于横向模式-并将相应的Fragment添加到每个布局中。这样,当Activity被重新创建时,FragmentManager将仅向Activity添加相关的Fragment。下面是一个示例,说明您可以如何实现这一点:
创建两个布局文件:一个用于肖像模式(例如,g. activity_main。XML)和一个用于横向模式(例如,g. activity_main_land。xml). activity_main.联系我们

<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<fragment
    android:id="@+id/fragment_one"
    android:name="com.example.FragmentOne"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone" />

活动_主要_土地。联系我们

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
    android:id="@+id/fragment_one"
    android:name="com.example.FragmentOne"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="match_parent" />

<fragment
    android:id="@+id/fragment_two"
    android:name="com.example.FragmentTwo"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="match_parent" />

在Activity的onCreate()方法中,根据设备的方向展开适当的布局,并将片段添加到Activity: www.example.com

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        FragmentOne fragmentOne = new FragmentOne();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, fragmentOne)
                .commit();
    } else {
        FragmentOne fragmentOne = new FragmentOne();
        FragmentTwo fragmentTwo = new FragmentTwo();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_one, fragmentOne)
                .add(R.id.fragment_two, fragmentTwo)
                .commit();
    }
}

使用这种方法,当您从纵向模式切换到横向模式时,FragmentManager会将两个Fragment添加到Activity,而当您切换回纵向模式时,FragmentManager只会将相关Fragment添加到Activity。此外,由于Fragment是直接添加到布局中的,因此您可以使用findViewById()而不是依赖于FragmentManager来访问其视图。

相关问题