我怎样才能得到以前的片段 android kotlin 的名称?

How can i get name of the previous Fragment android kotlin?

我需要找出用户从哪个片段切换到另一个片段。我想我应该使用片段名称,但我如何获得该名称?还是我的方法不太靠谱,还有其他的选择?

P.S.: 我使用 NavHostFragment 和 Kotlin

您可以将 OnDestinationChangedListener 添加到 NavController 以跟踪片段更改。

val navhostContainer = supportFragmentManager.findFragmentById(R.id.nav_host_container)
    controller = navhostContainer!!.findNavController()
    controller.addOnDestinationChangedListener(listener)

val listener = NavController.OnDestinationChangedListener{
        controller, destination, arguments ->
    println("Destination Observe: ${destination.label}")
}

片段发生变化时,监听器会被触发。

我希望该解决方案有助于解决您的问题。

更新 - 2021 年 11 月

您可以使用 previousBackStackEntry which returns a NavBackStackEntry 即:

,而不是使用传入参数跟踪前一个片段的头痛

the previous visible entry on the back stack or null if the back stack has less than two visible entries

因此,要获取上一个目的地的 ID,请使用:previousBackStackEntry?.destination?.id

例如,假设您有 3 个片段:fragment_a、fragment_b 和 fragment_c。在 fragment_c 你需要知道它是从哪里到达的:

要知道fragment_c中的上一个片段:

val previousFragment = findNavController().previousBackStackEntry?.destination?.id

previousFragment?.let {
    when (previousFragment) {
        R.id.fragment_a_id ->
            // The previous fragment is Fragment a

        R.id.fragment_b_id ->
            // The previous fragment is Fragment b

        else ->
            // The previous fragment is neither Fragment a nor b
    }
}


原始答案 - 2021 年 9 月

你会考虑 passing some data 在 destinations/fragments 之间;瞬间你会认为传入的数据是整数;并为每个片段创建常量整数,无论​​何时进行导航,然后传递为当前片段分配的常量。

示例:

通过使用 safe Args 进行操作并在导航期间传递数据。

假设我们要从 FragmentA 导航到 FragmentB:

NavGraph 应该有一个表示方向的动作和一个要在导航期间设置为原始片段的参数:

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
    app:startDestination="@id/mainFragment">

    <fragment
        android:id="@+id/fragmentA"
        android:name="......FragmentA"
        android:label="....">
        
        
        <action
            android:id="@+id/action_fragment_a_to_fragment_b"
            app:destination="@id/fragmentB" />
            
        <argument
            android:name="previousFragment"
            android:defaultValue="-1"
            app:argType="integer" />
            
            
    </fragment>


    <fragment
        android:id="@+id/fragmentB"
        android:name="......FragmentB"
        android:label="....">
        
        <argument
            android:name="previousFragment"
            android:defaultValue="-1"
            app:argType="integer" />
            
    </fragment>

   
</navigation>

创建对应于目标片段的常量:

companion object {
    const val FRAGMENT_A = 101
    const val FRAGMENT_B = 102
}

以及从 FragmentA 到 FragmentB 的导航动作:

做导航@FragmentA:

findNavController().navigate(
                FragmentADirections.actionFragmentAToFragmentB()
                    .setPreviousFragment(FRAGMENT_A)

然后检查 @FragmentB:

val args: FragmentBArgs = FragmentBArgs.fromBundle(requireArguments())
when (val previousFragment = args.previousFragment) {
    FRAGMENT_A -> {
        Log.d("LOG_TAG", "$previousFragment") // Should print 101
    }
    // Complete the rest of fragment cases
}