我怎样才能获得以前的Fragment android kotlin的名称?

one*_*tor 0 android android-fragments kotlin android-architecture-navigation

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

PS:我使用NavHostFragmentKotlin

Zai*_*ain 6

更新 - 2021 年 11 月

您可以使用previousBackStackEntry来代替使用传入参数跟踪前一个片段的麻烦,它返回一个NavBackStackEntry

返回堆栈上的前一个可见条目,如果返回堆栈少于两个可见条目,则返回 null

因此,要获取前一个目的地的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

原始答案 - 2021 年 9 月

您会考虑在目的地/片段之间传递一些数据;您会立即认为传入的数据是整数;并为每个片段创建常量整数,每当您进行导航时,然后传递为当前片段分配的常量。

例子:

通过在导航过程中使用安全参数进行操作和传递数据。

假设我们要从 导航FragmentAFragmentB

应该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>
Run Code Online (Sandbox Code Playgroud)

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

companion object {
    const val FRAGMENT_A = 101
    const val FRAGMENT_B = 102
}
Run Code Online (Sandbox Code Playgroud)

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

进行导航@FragmentA

findNavController().navigate(
                FragmentADirections.actionFragmentAToFragmentB()
                    .setPreviousFragment(FRAGMENT_A)
Run Code Online (Sandbox Code Playgroud)

然后检查@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
}
Run Code Online (Sandbox Code Playgroud)