android-fragments Android安全参数导航片段中的JetPack OnBackPress

m0rkklqb  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(182)

由于类型安全,我选择了Safe Args方法在片段之间传递数据。
发送者片段

btnNextPage.setOnClickListener{
        val amountTv: EditText = 
view!!.findViewById(R.id.edt_my_argument_view)
        val amount = amountTv.text.toString()
        val action = 
NavFragment01Directions.actionNavFragment01ToNavFragment02(amount)
        Navigation.findNavController(view).navigate(action)
    }

接收器片段

private val args: NavFragment02Args by navArgs()
.
.
.
    override fun onViewCreated(view: View, savedInstanceState: 
Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val txtWhole: TextView = view.findViewById(R.id.txt_whole_02)
    val receivedTxt = args.myArg
    txtWhole.text = receivedTxt.toString()
}

我的导航(_N)

<?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/my_nav"
app:startDestination="@id/navFragment01">
<fragment
    android:id="@+id/navFragment02"
    android:name="alidoran.android.navigation_safe_args.NavFragment02"
    android:label="fragment_nav02"
    tools:layout="@layout/fragment_nav02" >
    <argument
        android:name="my_arg"
        android:defaultValue="Ali"
        app:nullable="true" />
</fragment>
<fragment
    android:id="@+id/navFragment01"
    android:name="alidoran.android.navigation_safe_args.NavFragment01"
    android:label="fragment_nav01"
    tools:layout="@layout/fragment_nav01" >
    <action
        android:id="@+id/action_navFragment01_to_navFragment02"
        app:destination="@id/navFragment02" >
        <argument
            android:name="my_arg"
            app:argType="string"
            android:defaultValue="@null"
            app:nullable="true" />
    </action>

  </fragment>
</navigation>

这是完美的工作。
现在我想在按下后退按钮后,从接收方片段向发送方片段传递一个值。
我知道如何用Bundle来做,但我想用安全参数来做。另外,我知道可以为它创建一个操作,但我想在下面的Map对应的后按中处理它。

正如你所看到的,我们需要一个附加值的动作,但我不想创建一个从第二个到第一个的动作。我知道如何在后按中处理它,但我想用安全参数的方式。

6vl6ewon

6vl6ewon1#

使用导航组件最好的方法是通过savedStateHandle:

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", result)

并观察以下响应:

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Type>("key")?.observe(viewLifecycleOwner) {result ->
    // the result.
}

如文件中所定义:
若要将数据从目的B传回目的A,请先将目的A设定为接听其SavedStateHandle上的结果。若要这麽做,请使用getCurrentBackStackEntry()API撷取NavBackStackEntry,然后观察SavedStateHandle所提供的LiveData。
https://developer.android.com/guide/navigation/navigation-programmatic#returning_a_result

ffscu2ro

ffscu2ro2#

最常见的方法是实现FragmentResultListener
文档很好地解释了这一点,可能比我能解释的更好。

wn9m85ua

wn9m85ua3#

我实现了这两种方法。我在网上看到了@davidte建议的方法,但我的错误是我以为结果会立即返回到第一个片段,所以我没有测试它。令人惊讶的是,在实现后,它工作得很好。返回到第一个片段后,结果会返回到第一个方法。@Martin-Zeitler建议的方法,缺点是
1.我没有类型安全
1.我在两个片段中都有两个键值。
最终,我选择了@davidte方法。

相关问题