one*_*tor 0 android android-fragments kotlin android-architecture-navigation
我需要找出用户从哪个片段切换到另一个片段。我认为我应该使用片段名称,但如何获得该名称?还是我的方法不太可靠,还有其他选择?
PS:我使用NavHostFragmentKotlin
您可以使用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)
您会考虑在目的地/片段之间传递一些数据;您会立即认为传入的数据是整数;并为每个片段创建常量整数,每当您进行导航时,然后传递为当前片段分配的常量。
通过在导航过程中使用安全参数进行操作和传递数据。
假设我们要从 导航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>
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)
| 归档时间: |
|
| 查看次数: |
1155 次 |
| 最近记录: |