android-fragments 如何注意DialogFragment在我的Fragment中被解除?

bwitn5fc  于 2022-11-13  发布在  Android
关注(0)|答案(2)|浏览(174)

我正在从Fragment导航到DialogFragment。我想做的是注意到这个DialogFragment在我的Fragment中被忽略了,以便做一些事情。
我尝试这样做更新一个LiveData,但由于某种原因,当DialogFragment关闭时,LiveData的值永远不会像我试图做的那样为真。

我的片段:

private val myViewModel: MyViewModel by viewModel() //Using Koin
btn1.setOnClickListener{
   findNavController().navigate(R.id.my_dialog_fragment)
}

myViewModel.dialogFragmentIsClosed.observe(viewLifecycleOwner){isClosed->
if(isClosed)
  //do something
}

我的视图模型:

private val _dialogFragmentIsClosed = MutableLiveData(false)
val dialogFragmentIsClosed: LiveData<Boolean> get() = _dialogFragmentIsClosed
fun isDialogFragmentClosed(closed:Boolean){
  _dialogFragmentIsClosed.postValue(closed)
}

对话片段:

private val myViewModel: MyViewModel by viewModel() //Using Koin

override fun onDismiss(dialog:DialogInterface){
  myViewModel.isDialogFragmentClosed(true)
  val bundle = bundleOf(Pair("argBoolean",true))
  findNavController().navigate(R.id.my_fragment,bundle)
}
ogsagwnx

ogsagwnx1#

您可以使用一个接口来侦听dismiss事件。
首先,创建界面并将其放入对话框片段中:

interface CloseListener {
    fun onClose()
}
class YourDialog(private val listener: CloseListener) : DialogFragment() {
   override fun onDismiss(dialog:DialogInterface){
      listener.onClose()
   }
}

然后,在您的片段中,像这样呼叫dialogfragment:

val yourDialog = YourDialog(object: CloseListener{
   override fun onClose() {
       //do something here, such as set value for your viewModel
   }
})
yourDialog.show(childFragmentManager, null)

希望能对你有所帮助

q5lcpyga

q5lcpyga2#

首先,您的DialogFragment和MyFragment没有共享MyViewModel的同一个示例。
要实现您的目标,您应该查看以下文档:https://developer.android.com/guide/navigation/navigation-programmatic#additional_considerations
您将从MyFragment中打开DialogFragment,然后从DialogFragment中观察结果。
如果要共享ViewModel的同一个示例,请改为使用activityViewModel()(而不是使用viewModel())

相关问题