简体   繁体   中英

Kotlin “toString()” Not Available in Android DataBinding

Just learned DataBinding and find out that the powerful built-in toString() from Kotlin is not available:

<layout 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="student"
            type="com.example.databindingtest2.Student" />

    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{student.name}"
        android:textColor="@android:color/black"
        android:textSize="30sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="@{student.age.toString()}"    //doesn't work, age is integer
        android:textColor="@android:color/black"
        android:textSize="30sp" />

</layout>

I know String.valueOf() will work, but it's not Kotlin way. Any help would be appreciated.

doesn't work, age is integer

There is no type in either Java or Kotlin named integer . I am going to guess that age is a Kotlin Int .

cannot find method toString() in class int

Data binding is implemented in Java, not Kotlin. Java/Kotlin interoperability, combined with the data binding compiler, appears to be converting the Kotlin Int into the Java int primitive type. Java primitives do not extend Object and do not have toString() .

Personally, I recommend not investing in data binding. Jetpack Compose will make data binding obsolete in a year or so.

If you still wish to use data binding, the simplest solution is String.valueOf() . While you say "it's not Kotlin way", you are working with data-binding-generated Java, not Kotlin.

If you still wish to use data binding, and you insist that you must use toString() ... try @{Integer.valueOf(student.age).toString()} . Integer.valueOf() will give you a Java Integer instance boxing your int , and Integer has a toString() method. This still has nothing really to do with Kotlin, but it would let you use toString() .

一个月后,我发现了这个技巧:

android:text="@{`` + viewModel.currentStudent.age}"     //"``" is key point!! Not single/double quote

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM