Я пытаюсь узнать больше о фрагментах. Я читал, что у него нет неявного стека, который будет обрабатывать 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 после добавления первого фрагмента.
Вот основная деятельность
<?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>
Что касается вашего комментария к уже удаленному ответу: пожалуйста, используйте опцию «Отметить», чтобы сообщить модераторам о плагиате, нам всегда очень интересно узнать об этом. :-)
@RyanM Спасибо за информацию. Хотя у меня есть скриншот. Может ли это помочь?
@MayurGajra обновлен кодом main_activity
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.
Подробнее об этом можно прочитать в документации фрагментарные транзакции.
Большое спасибо. Это была ошибка, скрытая на виду.
Что вы используете в качестве
container
? Не могли бы вы опубликовать свой код дляactivity_main
?