【问题标题】:Fragment is not added to the back stack when replaced替换时不将片段添加到后堆栈
【发布时间】:2020-05-27 13:12:59
【问题描述】:

以上是我到达 BeginnerFragment 之前的路径。

上面是activity/fragments的层次结构

  • 现状

在我的应用程序中,我有一个底部导航,在导航的每个片段中,我都有两个选项卡。

  • 问题

我的问题是,当我在 BeginnerFragment 并按下单元格后退按钮时,它会返回到 StatusFragment。

根据下面的代码,当我将它添加到 BackStack 时,我希望它返回到 EducationHomeFragment。

教育片段

public class EducationFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View root = inflater.inflate(R.layout.fragment_education, container, false);

        // Instanciando o Fragmento de página inicial da Educação
        EducationHomeFragment educationHomeFragment = new EducationHomeFragment();
        getActivity().getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, educationHomeFragment).addToBackStack(null).commit();

        return root;
    }
}

fragment_education

<?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/fragment_container"
     tools:context=".education.EducationFragment"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 </FrameLayout>

EducationHomeFragment

public class EducationHomeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View root = inflater.inflate(R.layout.fragment_education_home, container, false);

        CardView beginnerFreelance = root.findViewById(R.id.cardview_beginner_skills);

        beginnerFreelance.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BeginnerFragment fragment = new BeginnerFragment();

                getActivity().getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container , fragment)
                .addToBackStack(null)
                .commit();
            }
        });


        return root;
    }
}

fragment_education_home

<androidx.constraintlayout.widget.ConstraintLayout 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/fragment_education_home_container"
    tools:context=".education.EducationHomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EEE"
    >

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

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/text_academic_education"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:text="@string/academic_education"
                android:textColor="@color/colorPrimaryDark"
                app:fontFamily="@font/exo_2_semibold"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_advanced_skills" />

            <TextView
                android:id="@+id/title_courses_available"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:text="@string/general_courses"
                android:textColor="@color/colorPrimaryDark"
                app:fontFamily="@font/exo_2_semibold"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_qualifications" />

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_doctoral_courses"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                android:layout_marginBottom="20dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_master_courses">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/textView39"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/doctoral_courses"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_master_courses"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_specialization_courses">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/textView38"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/master_courses"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_specialization_courses"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_higher_courses">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/text_doctoral_courses"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/specialization_courses"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_higher_courses"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/text_academic_education">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/text_master_courses"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/higher_level_courses"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_advanced_skills"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_intermediate_skills">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/text_specialization_courses"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/advanced"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_study_status"
                android:layout_width="match_parent"
                android:layout_height="85dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/default_cardview_mgtop"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <ImageView
                        android:id="@+id/image_study_status"
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:layout_marginTop="10dp"
                        android:tint="@color/colorPrimary"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        app:srcCompat="@drawable/outline_menu_book_24" />

                    <TextView
                        android:id="@+id/text_study_status"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        android:text="@string/not_studying"
                        android:textColor="@color/colorPrimaryDark"
                        app:fontFamily="@font/exo_2_semibold"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/image_study_status" />

                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_qualifications"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/default_cardview_mgtop"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_study_status">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingTop="12dp"
                    android:paddingBottom="12dp">

                    <TextView
                        android:id="@+id/title_obtained_qualifications"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/qualifications_obtained"
                        android:textColor="@color/colorPrimaryDark"
                        app:fontFamily="@font/exo_2_semibold"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />

                    <TextView
                        android:id="@+id/obtained_qualification_1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        android:text="@string/no_course_completed"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/title_obtained_qualifications" />

                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_beginner_skills"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/title_courses_available">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/text_basic_courses"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/beginner"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:id="@+id/cardview_intermediate_skills"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginLeft="@dimen/default_cardview_mgsides"
                android:layout_marginTop="@dimen/cardview_list_margin"
                android:layout_marginRight="@dimen/default_cardview_mgsides"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardview_beginner_skills">

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:id="@+id/text_higher_courses"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/intermediate"
                        app:fontFamily="@font/exo_2"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            </androidx.cardview.widget.CardView>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

为什么没有将 FragmentEducationHome 添加到堆栈中?当我点击 BeginnerFragment 后退按钮时,我想返回 FragmentEducationHome。

【问题讨论】:

  • 您能否更详细地解释一下您的片段层次结构?您的初始段落与您提供的代码不匹配 - 您在哪里将初始片段添加到您的 Activity,该片段与您显示的其他片段有什么关系?
  • @ianhanniballake 我输入了更多细节,请看看是否清楚
  • 您正在替换片段,那么它如何添加到后台堆栈中,因为您必须添加它而不是替换它
  • @ShwetaChauhan 我尝试添加并没有任何改变,就像它没有添加到后台堆栈中一样
  • 你能告诉我当你按下返回时会发生什么吗?目前展示的是哪个片段?

标签: java android android-fragments


【解决方案1】:

这不是问题的直接答案

但 Google 建议使用 Jetpack Navigation 方法。

这将是单个 Activity 和多个片段。 Google Code Labs Link

这避免了很多双极性代码,如果我们必须处理回栈,保持片段计数等...

起初任何人都会觉得开始有点困难,但过一段时间,你可以掌握并转向新的方法,这是值得建议的。

  1. Nav_graph 避免了程序员添加/删除片段的责任
  2. 允许将数据(原始数据或带有 Parcelable 的数据类)从一个片段传递到另一个片段
  3. 从一个子导航图移动到另一个
  4. 还有更多...

我建议您在开始新的试验/项目后结帐this

编辑

即使建议了一个活动,如果需要,我们可能有多个活动及其对应的子片段图。这完全取决于需求。在我的上一个项目中,我们从单一活动概念开始。但随着应用程序复杂性的增加,决定为两个活动及其相应的子片段移动。

关于简洁代码架构,这也很容易适应......

祝你好运!

【讨论】:

  • 我相信这是一种非常合适的方式来做我想做的事。不幸的是,当导航底部和标签共存时,关于实现喷气背包导航的文档并不清楚。
  • 经过几个深夜阅读有关喷气背包导航的信息后,我终于明白了。谢谢!
【解决方案2】:

请参考这个question

在您的活动中覆盖 onBackPressed() 并调用它以从后台堆栈中删除当前片段,因为您添加了它。

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
    getSupportFragmentManager().popBackStackImmediate()
} else {
    finish();
}

【讨论】:

    【解决方案3】:

    确保 R.id.fragment_container 存在于父活动 xml(而不是片段 xml)中,并且在 EducationHomeFragment 中使用 .add 而不是 .replace 将 BeginnerFragment 添加到后台堆栈

    【讨论】:

    • fragment_container 是 EducationFragment 的 FrameLayout。我已经尝试过使用 .add ,即使那样它也不起作用,就像它没有被添加到 backstack 中一样。
    【解决方案4】:

    您已经将当前的container 片段替换为BeginnerFragment,因此您无法返回到之前的片段。尝试使用add(id, fragment, tag)addToBackStack(tag)。希望能帮到你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多