我正在尝试学习更多关于片段的知识,我读到它没有一个隐式的堆栈来处理onBackPress(),就像活动一样,所以我们需要把它添加到一个显式的堆栈中。
我的问题是,我们可以调用add()函数不止一次吗?或者,我们需要在添加第一个片段后调用replace()。
在这里,我在***FragmentA***上调用add(),然后在***FragmentB***上调用add()。在我调用add后,片段反栈计数增加,但屏幕仍显示第一个片段,即***FragmentA***。
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>
1条答案
按热度按时间z6psavjg1#
在我调用add之后,屏幕仍然显示第一个片段
你使用
LinearLayout
作为片段的容器。当你的片段被添加时,它们会从屏幕上消失,因为它们被垂直添加到第一个片段的下面。这就是为什么你总是在屏幕上看到你的第一个片段。您应该使用
FrameLayout
作为容器,这样您就可以在屏幕上看到最后一个事务处理的片段。为什么在添加第一个片段后,backstack计数仍然为0
commit()
方法是异步的,因此当您更新fragment_stack_count
文本时,回栈计数仍然不会增加,因为片段事务尚未完成,并且片段仍然不会添加到回栈中。摘自Android文档
调用commit()并不会立即执行事务,相反,事务会被安排在主UI线程上运行,只要它能够运行。
您可以在fragment transactions的文档中了解更多信息