在 tablayout 片段之间进行通信
Communicating between the tablayout Fragments
我使用了带有片段的选项卡布局。剧情是这样的。
Activity:
片段 1、片段 2、片段 3
从 Fragment2 更新 Fragment1 的 UI。
我试图访问片段中的方法,但结果是空指针异常。
- 您可以使用
Observer Pattern
来实现。为此,您必须在 MainActivity
中创建一个 MutableLiveData
并将其通过 interface
传递给 fragment
。
- 然后post从FragmentA取值,从FragmentB观察,变化
时做操作
创建接口:
interface UpdateFragmentListener {
fun onUpdate(): MutableLiveData<Any>
}
在 Activity
中实现:
class MainActivity: AppCompatActivity, UpdateFragmentListener {
val fragmentUpdate: MutableLiveData<Any> = MutableLiveData()
...
override fun onUpdate(): MutableLiveData<Any> = fragmentUpdate
}
片段A内部:
...
val updateListener: UpdateFragmentListener
override fun onAttach(context: Context) {
updateListener = context as UpdateFragmentListener
}
override fun onViewCreated(v: View, savedInstanceState: Bundle) {
super.onViewCreated(v, savedInstanceState
//use like this by modifying it wherever you need inside FragmentA
updateListener.onUpdate().postValue(Any())
}
片段 B 内部:
...
val updateListener: UpdateFragmentListener
override fun onAttach(context: Context) {
updateListener = context as UpdateFragmentListener
}
override fun onViewCreated(v: View, savedInstanceState: Bundle) {
super.onViewCreated(v, savedInstanceState
//Observe it and do operation wherever you need inside FragmentB
updateListener.onUpdate().observe(this, Observer {
// implement your logic here
})
}
我使用了带有片段的选项卡布局。剧情是这样的。
Activity:
片段 1、片段 2、片段 3
从 Fragment2 更新 Fragment1 的 UI。
我试图访问片段中的方法,但结果是空指针异常。
- 您可以使用
Observer Pattern
来实现。为此,您必须在MainActivity
中创建一个MutableLiveData
并将其通过interface
传递给fragment
。 - 然后post从FragmentA取值,从FragmentB观察,变化 时做操作
创建接口:
interface UpdateFragmentListener {
fun onUpdate(): MutableLiveData<Any>
}
在 Activity
中实现:
class MainActivity: AppCompatActivity, UpdateFragmentListener {
val fragmentUpdate: MutableLiveData<Any> = MutableLiveData()
...
override fun onUpdate(): MutableLiveData<Any> = fragmentUpdate
}
片段A内部:
...
val updateListener: UpdateFragmentListener
override fun onAttach(context: Context) {
updateListener = context as UpdateFragmentListener
}
override fun onViewCreated(v: View, savedInstanceState: Bundle) {
super.onViewCreated(v, savedInstanceState
//use like this by modifying it wherever you need inside FragmentA
updateListener.onUpdate().postValue(Any())
}
片段 B 内部:
...
val updateListener: UpdateFragmentListener
override fun onAttach(context: Context) {
updateListener = context as UpdateFragmentListener
}
override fun onViewCreated(v: View, savedInstanceState: Bundle) {
super.onViewCreated(v, savedInstanceState
//Observe it and do operation wherever you need inside FragmentB
updateListener.onUpdate().observe(this, Observer {
// implement your logic here
})
}