可以将Kotlin的isNullOrBlank()函数导入xml以便与数据绑定一起使用

时间:2018-08-23 12:37:51

标签: android kotlin android-databinding

通过数据绑定我正在设置文本字段的可见性。可见性取决于字符串为null或为空,或两者都不为。

<?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">

    <data>
        <import type="android.view.View"/>

        <variable
            name="viewModel"
            type="com.example.viewModel"/>
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        <TextView
            android:id="@+id/textField1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{viewModel.data.text}"
            android:visibility="@{(viewModel.data.text == null || viewModel.data.text.empty) ? View.GONE : View.VISIBLE}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/> 

    </android.support.constraint.ConstraintLayout>

是否可以在数据元素中创建导入,以便我可以使用kotlin.text.StringsKt类中的isNullOrBlank()函数?

它希望能够像这样使用它:android:visibility="@{(viewModel.data.title.isNullOrBlank() ? View.GONE : View.VISIBLE}"

2 个答案:

答案 0 :(得分:4)

Android数据绑定仍然从XML而不是Kotlin代码生成Java代码,一旦将数据绑定迁移到生成Kotlin代码而不是Java,我相信我们将能够在XML中使用Kotlin扩展功能,真的很酷。

我确信,随着Google大力推销Kotlin,这很快就会实现。但目前,您的人数是

@Uli提到的

TextUtils.isEmpty()别忘了写一个导入。

不能在xml中使用StringKt.isNullOrBlack的原因:

下面是Kotlin String.kt中的代码

@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
        returns(false) implies (this@isNullOrEmpty != null)
    }

    return this == null || this.length == 0
}

如您所见,它用@kotlin.internal.InlineOnly注释,它表示此方法的Java生成的代码将是私有的。

  

InlineOnly表示与此Kotlin对应的Java方法   函数被标记为私有,因此Java代码无法访问它(   是没有实际内联调用内联函数的唯一方法   它)。

这意味着它不能从Java调用,并且由于数据绑定生成的代码在JAVA中,因此也不能用于数据绑定。 Thumb规则是您可以从JAVA访问的规则,即使不仅仅使用我会说的旧Java方式,也可以在数据绑定中使用它。

答案 1 :(得分:2)

TextUtils.isEmpty()应该做您想要的。