Вызовите 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 после добавления первого фрагмента.

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

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

<?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
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
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

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