从Fragment到Activity的小部件数据



一个Activity打开片段A,B,C,D,E,F,G,H,....在PageView2中,它明显地在片段中来回滑动,所有的片段都使用绑定视图布局,它们只知道自己的布局,而不是彼此,活动只知道自己的布局绑定,所以当用户更改片段中的小部件时,该数据如何被发送回活动,以一种集体的方式,一个地方可以访问对片段a,B,C,D,E,F,G,H,....所做的所有更改以便保存输入。

我希望它的工作方式是;

  1. 用户点击编辑
  2. 修改片段
  3. 选择应用或取消更改。

它工作到一定程度,问题是如果碎片没有被初始化,你会得到一个即时崩溃,我认为我做错了。

class mySharedViewModel : ViewModel() {
lateinit var udetails : FragmentEdcardsDetailsBinding
lateinit var uanswers : FragmentEdcardsAnswersBinding
lateinit var umath : FragmentEdcardsMathBinding
lateinit var uanimimage : FragmentEdcardsMediaAnimimageBinding
lateinit var ufullscreen : FragmentEdcardsMediaFullscreenimageBinding
lateinit var uvideo : FragmentEdcardsMediaVideoBinding
lateinit var uaudio : FragmentEdcardsMediaAudioBinding
fun cardapply() {
mytools.debug("${udetails}" )
mytools.debug("${uanswers}" )
}
}

编辑2

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
u = FragmentEdcardsDetailsBinding.bind(view)
model.udetails= u
model.udetailsinit = true

创建了一个解决方案,我的直觉仍然告诉我这是错误的!想法是当应用是按下它检查是否模型。Udetailinit是true,因为测试一个未初始化的udetail只会导致崩溃。

这应该使用共享的ViewModel来完成,你应该在你的Activity中创建一个ViewModel对象,然后在你的片段中使用活动范围访问这个ViewModel

定义ViewModel

class MyViewModel : ViewModel() {
val action: MutableLiveData<String> = MutableLiveData()
}

Activity中创建ViewModel的对象

class SomeActivity: AppCompatActivity(){
// create ViewModel 
val model: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
model.action.observe(viewLifecycleOwner, Observer<String> { action->
// Do something with action
})
}
}

和在你的片段访问ViewModelActivity范围

class SomeFragment: Fragment() {
private val model: MyViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

// Change value of action and notify Activity
model.action.value = "SomeAction"
}
}

最新更新