【问题标题】:How can we achieve Shared View Model communication between a Fragment and Activity, where the Activity is not the Parent我们如何实现 Fragment 和 Activity 之间的共享视图模型通信,其中 Activity 不是 Parent
【发布时间】:2021-05-02 01:53:58
【问题描述】:

鉴于 Activity 不是父 Activity,我正在尝试实现 Fragment 到 Activity 的通信。

所以,我有一个MainActivity,其中有一个名为ContactListFragment 的片段,当单击MainActivityBottomNavigationView 上的添加按钮时,我正在打开另一个AddContactActivity 以添加联系人。我的要求是当我单击AddContactActivity 上的保存按钮时,我需要在ContactListFragment 中启动与服务器的数据同步。我认为最好的方法是为此使用共享视图模型,但在这种情况下,我应该如何创建视图模型以便生命周期所有者不会被更改?

我曾考虑使用Application Context 作为所有者,但我觉得这样的任务有点过头了,当其他模块添加到项目中时可能会产生一些后果。

那么有没有办法有效地实施这种方法?谢谢。

【问题讨论】:

  • 使用接口怎么样?
  • 你建议如何实现它?由于打开了不同的活动,我如何确保MainActivity 在调用接口实现之前仍在后台?
  • “我的要求是当我点击 AddContactActivity 上的保存按钮时,我需要在 ContactListFragment 中启动与服务器的数据同步。”。只需从列表片段中执行startActivityForResult。当您从添加屏幕返回时,在 Intent 中发送一些数据并在列表片段中的 onActivityResult 中开始同步
  • 好吧,我的意思是,这是 imo 的最后一个选项。不过,我希望有一个更好的解决方案,这样我就可以以模块化的方式处理这个问题,并且尽可能减少耦合。谢谢。

标签: android android-fragments android-activity android-lifecycle android-viewmodel


【解决方案1】:

用你需要同步的对象/对象/数据类型编写一个接口类

interface OnSaveClickListener {
    fun onSaveClicked(contact: Contact)
}

现在在 ContactListFragment 类中

class ContactListFragment : Fragment(), OnSaveClickListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        (activity as AddContactACtivity).mOnSaveClickListener = this
    }

   
    override fun onSaveClicked(contact: Contact) {
        // Whatever you want to do with the data
    }
        
}

在 AddContactActivity 中,

class AddContactActivity {
   var mOnSaveClickListener : OnSaveClickListener? = null

   private void whenYouClickSave(contact: Contact){
       mOnSaveClickListener?.onSaveClicked(contact)
   }

【讨论】:

  • 虽然这是一个很好的解决方案,但它并没有实现我正在寻找的使用共享视图模型的松散耦合。但既然它只是工作,我会接受这个并表示感谢。
  • 如果你想拥有一个视图模型github.com/android/architecture-components-samples/issues/29的单个对象,请尝试使用此处解释的ViewModelFactory@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多