一个Activity打开片段A,B,C,D,E,F,G,H,....在PageView2中,它明显地在片段中来回滑动,所有的片段都使用绑定视图布局,它们只知道自己的布局,而不是彼此,活动只知道自己的布局绑定,所以当用户更改片段中的小部件时,该数据如何被发送回活动,以一种集体的方式,一个地方可以访问对片段a,B,C,D,E,F,G,H,....所做的所有更改以便保存输入。
我希望它的工作方式是;
- 用户点击编辑
- 修改片段
- 选择应用或取消更改。
它工作到一定程度,问题是如果碎片没有被初始化,你会得到一个即时崩溃,我认为我做错了。
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
})
}
}
和在你的片段访问ViewModel
从Activity
范围
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"
}
}