无法从 activity 观察视图模型中的实时数据集
Unable to observe livedata set in viewmodel from activity
我是一名新手 Android 开发人员,我正在尝试从其父 activity 观察 ViewModel 中的布尔集。我可以在应用程序启动后立即观察到它的初始状态,但以后应用的任何更改似乎都不会触发观察者(即当我切换片段时)。
这是我的 ViewModel 的代码:
class MyMusicViewModel : ViewModel() {
private var _MyMusicViewOn = MutableLiveData<Boolean>()
val MyMusicViewOn: LiveData<Boolean> get() = _MyMusicViewOn
init {
Timber.i("MyMusicViewModel Init Called!")
setMyMusicView(true)
}
override fun onCleared() {
super.onCleared()
Timber.i("MyMusicViewModel Cleared!")
setMyMusicView(false)
}
fun setMyMusicView(setter: Boolean) {
Timber.i("MyMusicViewModel setter called! %s", setter)
_MyMusicViewOn.value = setter
}
}
这是其父级的 activity:
class FullscreenActivity : AppCompatActivity() {
private val viewModel: MyMusicViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.MyMusicViewOn.observe(this, Observer { MyMusicViewOn ->
Timber.i("Observer called for MyMusicViewOn %s", MyMusicViewOn)
})
}
}
如果您想查看 ViewModel 的相关片段,这里是:
class MyMusicFragment : Fragment() {
private lateinit var viewModel: MyMusicViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding = DataBindingUtil.inflate<FragmentMyMusicBinding>(
inflater,
R.layout.fragment_my_music,
container,
false
)
viewModel = ViewModelProvider(this).get(MyMusicViewModel::class.java)
return binding.root
}
override fun onResume() {
super.onResume()
Timber.i("MyMusicViewFragment resumed!")
viewModel.setMyMusicView(true)
}
}
我想要完成的是在通过更改 MyMusicViewOn MutableLiveData 布尔值的状态调用 onResume()、onCleared() 和 init{} 函数时观察它们。我不明白的是,为什么那个布尔值在更改时不会触发父 activity 中设置的观察者。
提前感谢您的任何想法!
祝一切顺利,
很棒
我猜测无论您在 Fragment 中填充 viewModel
属性,您都没有使用 Activity 的 ViewModel 实例。获取 Activity 使用的相同实例的最简单方法是使用 activityViewModels
委托:
private val viewModel: MyMusicViewModel by activityViewModels()
我是一名新手 Android 开发人员,我正在尝试从其父 activity 观察 ViewModel 中的布尔集。我可以在应用程序启动后立即观察到它的初始状态,但以后应用的任何更改似乎都不会触发观察者(即当我切换片段时)。
这是我的 ViewModel 的代码:
class MyMusicViewModel : ViewModel() {
private var _MyMusicViewOn = MutableLiveData<Boolean>()
val MyMusicViewOn: LiveData<Boolean> get() = _MyMusicViewOn
init {
Timber.i("MyMusicViewModel Init Called!")
setMyMusicView(true)
}
override fun onCleared() {
super.onCleared()
Timber.i("MyMusicViewModel Cleared!")
setMyMusicView(false)
}
fun setMyMusicView(setter: Boolean) {
Timber.i("MyMusicViewModel setter called! %s", setter)
_MyMusicViewOn.value = setter
}
}
这是其父级的 activity:
class FullscreenActivity : AppCompatActivity() {
private val viewModel: MyMusicViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.MyMusicViewOn.observe(this, Observer { MyMusicViewOn ->
Timber.i("Observer called for MyMusicViewOn %s", MyMusicViewOn)
})
}
}
如果您想查看 ViewModel 的相关片段,这里是:
class MyMusicFragment : Fragment() {
private lateinit var viewModel: MyMusicViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding = DataBindingUtil.inflate<FragmentMyMusicBinding>(
inflater,
R.layout.fragment_my_music,
container,
false
)
viewModel = ViewModelProvider(this).get(MyMusicViewModel::class.java)
return binding.root
}
override fun onResume() {
super.onResume()
Timber.i("MyMusicViewFragment resumed!")
viewModel.setMyMusicView(true)
}
}
我想要完成的是在通过更改 MyMusicViewOn MutableLiveData 布尔值的状态调用 onResume()、onCleared() 和 init{} 函数时观察它们。我不明白的是,为什么那个布尔值在更改时不会触发父 activity 中设置的观察者。
提前感谢您的任何想法!
祝一切顺利,
很棒
我猜测无论您在 Fragment 中填充 viewModel
属性,您都没有使用 Activity 的 ViewModel 实例。获取 Activity 使用的相同实例的最简单方法是使用 activityViewModels
委托:
private val viewModel: MyMusicViewModel by activityViewModels()