通过数据绑定我正在设置文本字段的可见性。可见性取决于字符串为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}"
答案 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()应该做您想要的。