使用 Mutablelivedata 从 DialogFragment ColorPicker 更改片段的背景颜色不起作用
Change background color of a Fragment from DialogFragment ColorPicker using Mutablelivedata not working
我的应用程序应该能够从拾色器(即 DialogFragment)的片段(称为颜色预览)中更改屏幕的一部分的颜色,并在单击按钮后显示。我在 Fragment 和 DialogFragment 中使用了带有 MutableLiveData 的相同 ViewModel。但是,当我在 DialogFragment 中选择一些颜色时,我无法在 Fragment 中获取有关颜色的数据。下面的代码。
对话片段:
class ColorFragment : DialogFragment() {
private var _binding: FragmentColorBinding? = null
private val binding get() = _binding!!
private val viewModel: MainViewModel by lazy {
getViewModel {
MainViewModel()
}
}
@SuppressLint("DialogFragmentInsteadOfSimpleDialog")
override fun onStart() {
super.onStart()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
FragmentColorBinding.inflate(inflater, container, false).apply {
_binding = this
lifecycleOwner = this@ColorFragment
mainViewModel = getViewModel()
return root
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.color02.setOnClickListener {
viewModel.currentLightProfileColor.value = "#00ffff"
}
}
主要片段(应显示颜色的地方)如下所示:
class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!
private var viewCreated = false
private val viewModel: MainViewModel by lazy {
getViewModel {
MainViewModel()
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
FragmentMainBinding.inflate(inflater, container, false).apply {
_binding = this
lifecycleOwner = this@MainFragment
mainViewModel = getViewModel()
executePendingBindings()
viewCreated = true
return root
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.colorPreview.holder?.addCallback(this)
viewModel.currentLightProfileColor.observe(viewLifecycleOwner) { color ->
Color.parseColor(color.toString()).let { color ->
Timber.d("color LiveDataGet: ${color}")
binding.colorPreview.setBackgroundColor(color)
}
}
binding.color.setOnClickListener {
findNavController().navigate(R.id.ColorFragment)
}
}
在我的 ViewModel 中只有颜色的 MutableLiveData:
class MainViewModel : ViewModel() {
val currentLightProfileColor = MutableLiveData<String>()}
我没有收到任何错误,但是一旦我点击 color2,我应该从日志中的 Timber 获取:“color LiveDataGet: #00ffff”,但我没有收到,而且颜色预览不会改变颜色。
我错过了什么吗?
如果有人可以快速查看我的代码,我将不胜感激。谢谢!
我找到了解决办法。在 Kotlin 中,如果在没有 activityViewModels() 的情况下实例化 viewModels(),则不会共享数据。
所以我改变了我的代码,而不是:
private val viewModel: MainViewModel by lazy {
getViewModel {
LightmvpViewModel()
}
}
我写了:
private val viewModel: MainViewModel by activityViewModels()
通过这个简单的更改,一切都应该正常。
我的应用程序应该能够从拾色器(即 DialogFragment)的片段(称为颜色预览)中更改屏幕的一部分的颜色,并在单击按钮后显示。我在 Fragment 和 DialogFragment 中使用了带有 MutableLiveData 的相同 ViewModel。但是,当我在 DialogFragment 中选择一些颜色时,我无法在 Fragment 中获取有关颜色的数据。下面的代码。
对话片段:
class ColorFragment : DialogFragment() {
private var _binding: FragmentColorBinding? = null
private val binding get() = _binding!!
private val viewModel: MainViewModel by lazy {
getViewModel {
MainViewModel()
}
}
@SuppressLint("DialogFragmentInsteadOfSimpleDialog")
override fun onStart() {
super.onStart()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
FragmentColorBinding.inflate(inflater, container, false).apply {
_binding = this
lifecycleOwner = this@ColorFragment
mainViewModel = getViewModel()
return root
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.color02.setOnClickListener {
viewModel.currentLightProfileColor.value = "#00ffff"
}
}
主要片段(应显示颜色的地方)如下所示:
class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!
private var viewCreated = false
private val viewModel: MainViewModel by lazy {
getViewModel {
MainViewModel()
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
FragmentMainBinding.inflate(inflater, container, false).apply {
_binding = this
lifecycleOwner = this@MainFragment
mainViewModel = getViewModel()
executePendingBindings()
viewCreated = true
return root
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.colorPreview.holder?.addCallback(this)
viewModel.currentLightProfileColor.observe(viewLifecycleOwner) { color ->
Color.parseColor(color.toString()).let { color ->
Timber.d("color LiveDataGet: ${color}")
binding.colorPreview.setBackgroundColor(color)
}
}
binding.color.setOnClickListener {
findNavController().navigate(R.id.ColorFragment)
}
}
在我的 ViewModel 中只有颜色的 MutableLiveData:
class MainViewModel : ViewModel() {
val currentLightProfileColor = MutableLiveData<String>()}
我没有收到任何错误,但是一旦我点击 color2,我应该从日志中的 Timber 获取:“color LiveDataGet: #00ffff”,但我没有收到,而且颜色预览不会改变颜色。
我错过了什么吗? 如果有人可以快速查看我的代码,我将不胜感激。谢谢!
我找到了解决办法。在 Kotlin 中,如果在没有 activityViewModels() 的情况下实例化 viewModels(),则不会共享数据。 所以我改变了我的代码,而不是:
private val viewModel: MainViewModel by lazy {
getViewModel {
LightmvpViewModel()
}
}
我写了:
private val viewModel: MainViewModel by activityViewModels()
通过这个简单的更改,一切都应该正常。