第三个片段不会被替换,只是添加在顶部
Third fragment wont get replaced, just added on top
我有 3 个简单的片段(用于测试目的)
片段 1
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/frameLHaupt"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".pkgActivity.FragmentHaupt">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Toolbar
android:id="@+id/toolbar3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
</com.google.android.material.appbar.AppBarLayout>
</LinearLayout>
</FrameLayout>
片段 2:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frameLActionBar"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".pkgActivity.FragmentActionBar">
<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="149dp"
tools:layout_editor_absoluteY="174dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/nextFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="next fragment" />
<Button
android:id="@+id/lastFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="last fragment" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Bro welcome custom actionbar" />
</LinearLayout>
</RelativeLayout>
和片段 3:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frameLayoutViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".pkgActivity.FragmentViewPager">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</FrameLayout>
正在调用片段 1 -> 片段 2:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.frameLHaupt, fragment2);
fragmentTransaction.commit();
=> 此代码工作正常,片段 1 的框架布局被片段的框架布局替换
但是当我调用 Fragment2 -> Fragment3 时:
FragmentViewPager fragment2 = new FragmentViewPager();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.frameLActionBar, fragment2);
fragmentTransaction.commit();
=> Fragment3 不会被替换,而是添加到 fragment2 之上。 W
我尝试使用 getActivity().getSuportFragmentManager()
但结果仍然相同,fragment3 被添加到 fragment2 之上。
可能是什么原因?我错过了什么吗?
您似乎为所有片段使用了不同的容器。当您替换片段时,容器 ID 表示片段所在的容器,不是 您要替换的视图的 ID。所以使用新的片段根作为片段容器是将每个片段放在前一个片段中。
我有 3 个简单的片段(用于测试目的)
片段 1
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/frameLHaupt"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".pkgActivity.FragmentHaupt">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Toolbar
android:id="@+id/toolbar3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
</com.google.android.material.appbar.AppBarLayout>
</LinearLayout>
</FrameLayout>
片段 2:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frameLActionBar"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".pkgActivity.FragmentActionBar">
<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="149dp"
tools:layout_editor_absoluteY="174dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/nextFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="next fragment" />
<Button
android:id="@+id/lastFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="last fragment" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Bro welcome custom actionbar" />
</LinearLayout>
</RelativeLayout>
和片段 3:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frameLayoutViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".pkgActivity.FragmentViewPager">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</FrameLayout>
正在调用片段 1 -> 片段 2:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.frameLHaupt, fragment2);
fragmentTransaction.commit();
=> 此代码工作正常,片段 1 的框架布局被片段的框架布局替换
但是当我调用 Fragment2 -> Fragment3 时:
FragmentViewPager fragment2 = new FragmentViewPager();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.frameLActionBar, fragment2);
fragmentTransaction.commit();
=> Fragment3 不会被替换,而是添加到 fragment2 之上。 W
我尝试使用 getActivity().getSuportFragmentManager()
但结果仍然相同,fragment3 被添加到 fragment2 之上。
可能是什么原因?我错过了什么吗?
您似乎为所有片段使用了不同的容器。当您替换片段时,容器 ID 表示片段所在的容器,不是 您要替换的视图的 ID。所以使用新的片段根作为片段容器是将每个片段放在前一个片段中。