如何解决有关数据绑定,实时数据和绘图的问题
我正在尝试将数据与实时数据绑定在一起,并遇到此错误
java.lang.RuntimeException: Failed to call observer method
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0
我的xml片段(仅粘贴了相关部分)
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="androidx.core.content.ContextCompat" />
<variable name="location" type="String"/>
<variable name="viewModel"
type="com.marty.dang.polarpointsweatherapp.presentation.viewmodel.DailyWeatherViewModel"/>
</data>
<ImageView
android:id="@+id/homeFrag_weather_icon"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginTop="40dp"
android:src="@{ContextCompat.getDrawable(context,viewModel.iconObservable)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/homeFrag_title_text_view" />
我的视图模型(仅粘贴相关部分)
val iconObservable: MutableLiveData<Int> by lazy { MutableLiveData<Int>() }
private fun determineWeatherIcon(weatherDescription: String) {
val icon = when(weatherDescription){
"Thunderstorm" -> R.drawable.thunderstorm_icon
"Drizzle" -> R.drawable.rain_icon
"Rain" -> R.drawable.rain_icon
"Snow" -> R.drawable.snow_icon
"Clear" -> R.drawable.sun_icon
"Clouds" -> R.drawable.cloudy_icon
else -> R.drawable.cloudy_icon
}
iconObservable.postValue(icon)
}
我的可绘制文件夹
但是,如果我只使用常规变量而不是可变的实时数据变量,则可以正常工作。
var weatherIcon = R.drawable.snow_icon
private fun determineWeatherIcon(weatherDescription: String) {
weatherIcon = when(weatherDescription){
"Thunderstorm" -> R.drawable.thunderstorm_icon
"Drizzle" -> R.drawable.rain_icon
"Rain" -> R.drawable.rain_icon
"Snow" -> R.drawable.snow_icon
"Clear" -> R.drawable.sun_icon
"Clouds" -> R.drawable.cloudy_icon
else -> R.drawable.cloudy_icon
}
}
android:src="@{ContextCompat.getDrawable(context,viewModel.weatherIcon)}"
任何帮助将不胜感激。谢谢!
解决方法
iconObservable.value 在您的xml上尝试一下,它将起作用
,您可以在XML中使用app:imageResource
属性:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="location" type="String"/>
<variable name="viewModel" type="com.marty.dang.polarpointsweatherapp.presentation.viewmodel.DailyWeatherViewModel"/>
</data>
<ImageView
android:id="@+id/homeFrag_weather_icon"
app:imageResource="@{viewModel.iconObservable}"
... />
...
在viewModel中,您应该具有以下属性:
val iconObservable: MutableLiveData<Int>
您可以使用以下方法:
private fun determineWeatherIcon(weatherDescription: String) {
iconObservable.value = when(weatherDescription){
"Thunderstorm" -> R.drawable.thunderstorm_icon
"Drizzle" -> R.drawable.rain_icon
"Rain" -> R.drawable.rain_icon
"Snow" -> R.drawable.snow_icon
"Clear" -> R.drawable.sun_icon
"Clouds" -> R.drawable.cloudy_icon
else -> R.drawable.cloudy_icon
}
}
除非在后台线程中设置值,否则不需要postValue
。
在片段类中,应将viewModel
和lifecycleOwner
设置为binding
:
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
binding = YourFragmentBinding.inflate(inflater,container,false)
binding.viewModel = viewModel
binding.lifecycleOwner = viewLifecycleOwner
return binding.root
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。