zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

【错误记录】Android Studio 中 DataBinding 布局报错 ( Resources$NotFoundException: String resource ID #0xd )

Android错误Studio 报错 string 记录 ID 布局
2023-06-13 09:17:40 时间

文章目录

一、错误记录


在 Android Studio 中 DataBinding 报错如下 :

Skia GL Pipeline
Invalid ID 0x0000000d.
Shutting down VM
FATAL EXCEPTION: main
Process: kim.hsl.databinding_demo, PID: 9397
android.content.res.Resources$NotFoundException: String resource ID #0xd
	at android.content.res.Resources.getText(Resources.java:348)
	at android.widget.TextView.setText(TextView.java:5831)
	at kim.hsl.databinding_demo.databinding.ActivityMainBindingImpl.executeBindings(ActivityMainBindingImpl.java:115)
	at androidx.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:512)
	at androidx.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:484)
	at androidx.databinding.ViewDataBinding$7.run(ViewDataBinding.java:218)
	at androidx.databinding.ViewDataBinding$6.onViewAttachedToWindow(ViewDataBinding.java:187)
	at android.view.View.dispatchAttachedToWindow(View.java:18358)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3397)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1764)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1463)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7190)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
	at android.view.Choreographer.doCallbacks(Choreographer.java:761)
	at android.view.Choreographer.doFrame(Choreographer.java:696)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
	at android.os.Handler.handleCallback(Handler.java:873)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:193)
	at android.app.ActivityThread.main(ActivityThread.java:6718)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

二、解决方案


在 DataBinding 中设置的数据类模型如下 :

package kim.hsl.databinding_demo

class Student(var name: String, var age: Int)

注意上面的数据类中 , age 字段是 int 类型的 ;

DataBinding 的布局文件如下 :

<?xml version="1.0" encoding="utf-8"?>
<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="student"
            type="kim.hsl.databinding_demo.Student" />
    </data>

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

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="Tom"
            android:text="@{student.name}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.4" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="18"
            android:text="@{student.age}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2"
            app:layout_constraintVertical_bias="0.2" />

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

特别注意 , 其中的下面的组件 , 直接将 age 字段作为值 , 设置到了 text 中 ,

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="18"
            android:text="@{student.age}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2"
            app:layout_constraintVertical_bias="0.2" />

text 中接收字段 , 如果发现 int 会将其当做资源 ID 进行处理 , 肯定会报错 ;

这里将其转为 String 类型设置 ;

android:text 属性值 , 设置为 @{String.valueOf(student.age)} ;

最终该组件为 :

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="18"
            android:text="@{String.valueOf(student.age)}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2"
            app:layout_constraintVertical_bias="0.2" />

三、DataBinding 布局 - 字符串拼接


在 DataBinding 布局中 , 可以使用 表达式 拼接多个字符串 , 使用 + 运算符直接拼接即可 ;

数据类 :

class Student(var name: String, var age: Int)

在 DataBinding 布局文件中 , 使用 @{student.name + ’ ’ + student.age} 可以拼接字符串 ;

组件如下 :

<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{student.name + ' ' + student.age}" />