Android字符串链接无法使用数据绑定



我正在尝试将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">

相关内容

  • 没有找到相关文章

最新更新