gpt4 book ai didi

android - NotFoundException : String resource ID #0x0 when binding string resource

转载 作者:行者123 更新时间:2023-12-04 23:51:58 25 4
gpt4 key购买 nike

我目前正在使用绑定(bind)来使用 android View 模型动态设置各种 TextView 的文本。目前, View 模型看起来像这样:

class MyViewModel(
resources: Resources,
remoteClientModel: Model = Model()
) : ObservableViewModel() {

init {
observe(remoteClientModel.liveData) {
notifyChange()
}

fun getTextViewTitle(): String = when {
someComplicatedExpression -> resources.getString(R.string.some_string, null)
else -> resources.getString(R.string.some_other_string)
}
}

和 xml 布局:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View"/>

<variable
name="viewModel"
type="my.app.signature.MyViewModel"/>
</data>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.textViewTitle}"
android:textAlignment="center"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

但是我想删除注入(inject)到 View 模型中的“资源:资源”,因为资源与 Activity 耦合。代码现在只返回字符串资源 id:
  fun getTextViewTitle(): Int = when {
someComplicatedExpression -> R.string.some_string
else -> R.string.some_other_string
}

因此,我删除了 Activity 依赖项。编译器认为这很好,但它在运行时崩溃并出现以下异常:android.content.res.Resources$NotFoundException: String resource ID #0x0。

尝试使用以下方法将 lifeCycleOwner 附加到绑定(bind)时会发生这种情况:
override fun onActivityCreated(savedInstanceState: Bundle?) {
// Some more code....
binding.lifecycleOwner = activity
// Some more code....

我不确定如何从 View 模型中删除资源依赖项,而不会在运行时崩溃。

编辑:

澄清一下:我的示例中的 ObservableViewModel 与此处找到的完全相同:

https://developer.android.com/topic/libraries/data-binding/architecture

用于执行 notifyChange。

最佳答案

这里的问题是代码试图调用 textView.setText(0)这会导致错误,因为没有 id 为 0x0 的字符串资源。发生这种情况是因为 getTextViewTitle()返回 Int并且 View 绑定(bind)功能将使其默认为 0(初始化时)。
https://developer.android.com/topic/libraries/data-binding/expressions#property_reference
从文档

Avoiding null pointer exceptions

Generated data binding code automatically checks for null values and avoid null pointer exceptions. For example, in the expression @{user.name}, if user is null, user.name is assigned its default value of null. If you reference user.age, where age is of type int, then data binding uses the default value of 0.


也许这样的事情可以工作,
android:text='@{viewModel.textViewTitle == 0 ? "" : @string{viewModel.textViewTitle}}'
或者
android:text='@{viewModel.textViewTitle, default=""}'

关于android - NotFoundException : String resource ID #0x0 when binding string resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com