由于类型安全,我选择了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对应的后按中处理它。
正如你所看到的,我们需要一个附加值的动作,但我不想创建一个从第二个到第一个的动作。我知道如何在后按中处理它,但我想用安全参数的方式。
3条答案
按热度按时间6vl6ewon1#
使用导航组件最好的方法是通过savedStateHandle:
并观察以下响应:
如文件中所定义:
若要将数据从目的B传回目的A,请先将目的A设定为接听其SavedStateHandle上的结果。若要这麽做,请使用getCurrentBackStackEntry()API撷取NavBackStackEntry,然后观察SavedStateHandle所提供的LiveData。
https://developer.android.com/guide/navigation/navigation-programmatic#returning_a_result
ffscu2ro2#
最常见的方法是实现
FragmentResultListener
。文档很好地解释了这一点,可能比我能解释的更好。
wn9m85ua3#
我实现了这两种方法。我在网上看到了@davidte建议的方法,但我的错误是我以为结果会立即返回到第一个片段,所以我没有测试它。令人惊讶的是,在实现后,它工作得很好。返回到第一个片段后,结果会返回到第一个方法。@Martin-Zeitler建议的方法,缺点是
1.我没有类型安全
1.我在两个片段中都有两个键值。
最终,我选择了@davidte方法。