Вызовите add() дважды с другим фрагментом

Я пытаюсь узнать больше о фрагментах. Я читал, что у него нет неявного стека, который будет обрабатывать onBackPress(), как это делают действия, поэтому нам нужно добавить его в явный стек.

Мой вопрос: можем ли мы вызвать функцию add() более одного раза или нам нужно вызвать replace() после добавления первого фрагмента.

Здесь я вызываю add() для ФрагментА, затем вызываю add() для ФрагментБ. Счетчик обратного стека фрагментов увеличивается после того, как я вызываю add, но на экране все еще отображается первый фрагмент, то есть ФрагментА.

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fragment_stack_count.text = supportFragmentManager.backStackEntryCount.toString()



        add_a.setOnClickListener { it
            addFragmentA()
        }

        add_b.setOnClickListener {
            addFragmentB()
        }
    }

    fun addFragmentA() {
        val fragA = FragmentA()
        supportFragmentManager.beginTransaction().add(R.id.container, fragA).addToBackStack("A").commit()
        fragment_stack_count.text = supportFragmentManager.backStackEntryCount.toString()

    }

    fun addFragmentB() {
        val fragB = FragmentB()
        supportFragmentManager.beginTransaction().add(R.id.container, fragB).addToBackStack("B").commit()
        fragment_stack_count.text = supportFragmentManager.backStackEntryCount.toString()
    }

    
}

также почему счетчик обратного стека по-прежнему равен 0 после добавления первого фрагмента.

enter image description here

Вот основная деятельность

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#D8EFFA"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="12dp"
        android:background="@color/white"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent="0.8"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </LinearLayout>


    <TextView
        android:id="@+id/fragment_stack_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/add_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ADD A"
        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/add_b"
        app:layout_constraintTop_toBottomOf="@+id/container" />

    <Button
        android:id="@+id/add_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ADD B"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/add_a"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/container" />
</androidx.constraintlayout.widget.ConstraintLayout>

Что вы используете в качестве container? Не могли бы вы опубликовать свой код для activity_main?

Mayur Gajra 10.04.2022 14:56

Что касается вашего комментария к уже удаленному ответу: пожалуйста, используйте опцию «Отметить», чтобы сообщить модераторам о плагиате, нам всегда очень интересно узнать об этом. :-)

Ryan M 10.04.2022 15:58

@RyanM Спасибо за информацию. Хотя у меня есть скриншот. Может ли это помочь?

chris 10.04.2022 17:09

@MayurGajra обновлен кодом main_activity

chris 10.04.2022 17:20
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

after I call add but the screen still showing the first fragment

Вы используете LinearLayout в качестве контейнера фрагментов. Когда ваши фрагменты добавляются, они исчезают с экрана, поскольку добавляются вертикально под первым фрагментом. Вот почему вы всегда видите свой первый фрагмент на экране.

Вы должны использовать FrameLayout в качестве контейнера, чтобы вы могли видеть свой последний транзакционный фрагмент на экране.

why is the backstack count is still 0 once first fragment is added

Метод commit() является асинхронным, поэтому при обновлении текста fragment_stack_count счетчик обратного стека по-прежнему не увеличивается, поскольку транзакции фрагментов еще не завершены, и фрагмент все еще не добавляется в задний стек.

Выдержка из документа Android

Calling commit() doesn't perform the transaction immediately. Rather, the transaction is scheduled to run on the main UI thread as soon as it is able to do so.

Подробнее об этом можно прочитать в документации фрагментарные транзакции.

Большое спасибо. Это была ошибка, скрытая на виду.

chris 10.04.2022 19:09

Другие вопросы по теме