我正在尝试将Databinding与具有一些链接和一个变量的XMLString结合使用。问题是,当使用数据绑定时,链接不再工作。
XML文本
<data>
<variable
name="vm"
type="com.example.app.framework.ui.viewmodel.EmailViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/app_standard_agb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:linksClickable="true"
android:text="@{@string/app_agb(vm.btnText)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</TextView>
</androidx.constraintlayout.widget.ConstraintLayout>
当我使用android:text="@{@string/app_agb.concat(vm.btnText)}"
时,我会得到一个NullPointer异常,这是不可能的,因为我在其他地方使用了该变量,并且它是1000%而不是null。只需使用android:text="@string/app_agb"
即可。
字符串
<string name="app_agb">
By clicking %1$s you accept the
<a href="SOME LINK HERE, PRIVAT">privacy policies</a> and
<a href="SOME LINK HERE, PRIVAT">agbs</a> from example..
</string>
片段中的代码
app_standard_agb.movementMethod = LinkMovementMethod.getInstance()
编辑
我在布局中包含app_standard_agb
有什么不同吗?
我认为这是因为LiveData
在得到Observed之前不会发出Data,所以在得到Observer之前它的值是null,你可以使用@BindingAdapter
来检查这个值是否不是null,就像下面的代码一样
把下面的代码放在你的项目中的某个地方(我刚刚在Kotlin
中尝试过(:
@BindingAdapter("android:bindLink")
fun bindLink(view: TextView, link: String?) {
link?.let{
view.text = view.context.getString(R.string.app_agb, it)
}
}
XML应该是这样的:
<TextView
android:id="@+id/app_standard_agb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:linksClickable="true"
android:bindLink="@{vm.btnText}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">