Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否有一种方法可以向片段视图发出信号,表明数据已传递到参数中?_Android_Android Studio_Kotlin - Fatal编程技术网

Android 是否有一种方法可以向片段视图发出信号,表明数据已传递到参数中?

Android 是否有一种方法可以向片段视图发出信号,表明数据已传递到参数中?,android,android-studio,kotlin,Android,Android Studio,Kotlin,我正在尝试开发一个应用程序,其中我在片段中有微调器(第一个片段),要更新微调器选项,用户必须打开一个对话框窗口(第二个片段)并在其中输入。数据作为一个包通过接口传递,然后进入第一个片段参数。我的微调器位于第一个片段视图中,因此我无法理解如何从第二个参数调用第一个参数视图函数,相反,在第一个参数视图中,我不断检查参数是否更新,类似这样 if(!displayedText.isNullOrEmpty()) { updateListSpinner()

我正在尝试开发一个应用程序,其中我在片段中有微调器(第一个片段),要更新微调器选项,用户必须打开一个对话框窗口(第二个片段)并在其中输入。数据作为一个包通过接口传递,然后进入第一个片段参数。我的微调器位于第一个片段视图中,因此我无法理解如何从第二个参数调用第一个参数视图函数,相反,在第一个参数视图中,我不断检查参数是否更新,类似这样

  if(!displayedText.isNullOrEmpty()) {
                updateListSpinner()
                arguments?.clear()
            }

因此,在片段视图中,我经常检查参数是否更新,然后清除它们,一切都正常工作,但我只是想知道有什么更好的方法来完成它。

您可以使用片段结果侦听器。更多文档:。因此,在您的实例中,每当用户与对话框片段交互时,将结果发送到第一个片段,该片段将被注册以使用数据,您可以更新微调器

以下是一些在我的应用程序中控制导航的工作代码:

在第二段中:

open fun navigate(idOfDestination: Int, bundle: Bundle?) {
    val tempBundle = bundle ?: Bundle()
    tempBundle.putInt(NAVIGATION_DESTINATION, idOfDestination)
    activity?.supportFragmentManager?.setFragmentResult(NAVIGATION_RESULT, tempBundle)
}
在target fragment(在您的情况下,它将是第一个片段)中,注册侦听器:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    activity?.supportFragmentManager?.setFragmentResultListener(NAVIGATION_RESULT, this, FragmentResultListener { _, bundle ->
        val destination = bundle.getInt(NAVIGATION_DESTINATION)
        bundle.remove(NAVIGATION_DESTINATION)
        navigationHandler(bundle,destination)
    })
}

private fun navigationHandler(bundle: Bundle?, idOfDestination: Int) {
    navController = Navigation.findNavController(binding.root)
    if (!FeatureControlManager.isDestinationAllowedToGo(idOfDestination)) {
        navController = childFragmentManager.fragments.first().findNavController()
    }
    navController.validateAndNavigate(navController, idOfDestination, childFragmentManager, bundle)
}

这适用于viewmodel,对吗?我试图用没有mvvm的接口实现它,但我想mvvm是片段通信的最佳方法?@Michal,不,这只是片段,你不需要ViewModel.supportFragmentManager.setFragmentResultListener现在在“androidx.fragment:fragment ktx:1.3.0”中不可用。我想从2月21日起就可以了。