文章目录
- 一、错误记录
- 二、解决方案
- 三、DataBinding 布局 - 字符串拼接
一、错误记录
在 Android Studio 中 DataBinding 报错如下 :
代码语言:javascript复制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 中设置的数据类模型如下 :
代码语言:javascript复制package kim.hsl.databinding_demo
class Student(var name: String, var age: Int)
注意上面的数据类中 , age 字段是 int 类型的 ;
DataBinding 的布局文件如下 :
代码语言:javascript复制<?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 中 ,
代码语言:javascript复制 <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)}
;
最终该组件为 :
代码语言:javascript复制 <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 布局中 , 可以使用 表达式 拼接多个字符串 , 使用 运算符直接拼接即可 ;
数据类 :
代码语言:javascript复制class Student(var name: String, var age: Int)
在 DataBinding 布局文件中 , 使用 @{student.name ’ ’ student.age} 可以拼接字符串 ;
组件如下 :
代码语言:javascript复制<TextView
android:id="@ id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{student.name ' ' student.age}" />