20

我找到了问题,但在代码中没有解决方案

我想在回压/手动回退发生时获得数据。我习惯navigateUp()回去。如何将数据传递给前一个片段?navigateUp()没有任何工具可以将数据传递到前一个片段。即使我没有找到使用Safe Args的解决方案。它正在向前传递数据。我想在后向的 Frad B -> Frag A.

我的代码返回到上一个片段

Navigation.findNavController(view).navigateUp()

在此处输入图像描述

我的问题是,我怎样才能在以前的片段中获取数据。我可以使用从 Frag B 导航到 Frag A

4

6 回答 6

10

根据developer.android.com,您可以将 common 用于要使用其活动范围共享数据ViewModel的片段。

以下是步骤:

  1. 创建将保留数据的视图模型:
class SharedViewModel : ViewModel() {
    val dataToShare = MutableLiveData<String>()

    fun updateData(data: String) {
        dataToShare.value = data
    }
}
  1. 观察 Fragment1 中的数据变化:
class Fragment1 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
        viewModel.dataToShare.observe(this, Observer<String> { dataFromFragment2 ->
            // do something with data
        })
    }
}
  1. 更新数据,Fragment2如果您正确处理导航,现在,您应该能够在以下位置接收数据更改Fragment1
class Fragment2 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)

        updateDataButton.setOnClickListener { v ->
            viewModel.updateData("New data for fragment1")
        }
    }
}

我希望回答有帮助。

于 2019-03-08T10:08:04.370 回答
7

您可以使用NavigationResult库。基本上它startActivityForResult只是导航组件中的片段。

于 2019-05-24T18:51:58.753 回答
3

请使用官方androidx的组件。setFragmentResultListener()setFragmentResult()方法:

implementation "androidx.fragment:fragment-ktx:1.3.5"

干杯;)

于 2021-05-14T07:05:17.827 回答
0

要在从一个目的地导航到另一个目的地时弹出目的地,app:popUpTo请向关联<action>元素添加一个属性。要使用参数从 fargment2 导航到 Fragment1,请在导航图中指定action调用者片段的 和arguments目标片段的 :

<fragment
    android:id="@+id/fragment2"
    android:name="com.example.myapplication.Fragment2"
    android:label="fragment_2"
    tools:layout="@layout/fragment_2">

    <action
        android:id="@+id/action_2_to_1"
        app:destination="@id/fragment1"
        app:popUpTo="@+id/fragment1"/>
</fragment>
<fragment
    android:id="@+id/fragment1"
    android:name="com.example.myapplication.Fragment1"
    android:label="fragment_1"
    tools:layout="@layout/fragment_1">

        <argument
            android:name="someArgument"
            app:argType="string"
            app:nullable="false"
            android:defaultValue="Hello Word"/>
</fragment>

在您的 Fragment2 类中,您调用您的操作并传递您的参数:

   val action = Fragment2Directions.action2To1("MY_STRING_ARGUMENT")
        findNavController().navigate(action)
于 2020-10-18T17:12:51.740 回答
0

您应该使用静态变量/伴随对象,因为它比共享视图模型更好,因为它不是简单/好的架构。由于它并不简单,我认为这是最好的方法。

从 FragmentB 向上导航到 FragmentA

片段B:

isBackpressed = true
findNavController().navigateUp() 

片段A:

onViewCreated() {
    // todo
    if(isBackpressed) {
         isBackpressed = false
         // do whatever you want
    }
}
于 2020-09-05T09:55:30.363 回答
-4

你可以打电话

findNavController().navigate(R.id.fragment1, args)

其中 args 是您的捆绑包。在 fragment1 中,从参数中获取数据

于 2019-11-26T10:36:09.760 回答