android-fragments 使用不同片段调用add()两次

8zzbczxx  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(171)

我正在尝试学习更多关于片段的知识,我读到它没有一个隐式的堆栈来处理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>
z6psavjg

z6psavjg1#

在我调用add之后,屏幕仍然显示第一个片段
你使用LinearLayout作为片段的容器。当你的片段被添加时,它们会从屏幕上消失,因为它们被垂直添加到第一个片段的下面。这就是为什么你总是在屏幕上看到你的第一个片段。
您应该使用FrameLayout作为容器,这样您就可以在屏幕上看到最后一个事务处理的片段。
为什么在添加第一个片段后,backstack计数仍然为0
commit()方法是异步的,因此当您更新fragment_stack_count文本时,回栈计数仍然不会增加,因为片段事务尚未完成,并且片段仍然不会添加到回栈中。
摘自Android文档
调用commit()并不会立即执行事务,相反,事务会被安排在主UI线程上运行,只要它能够运行。
您可以在fragment transactions的文档中了解更多信息

相关问题