使用 DataBinding 设置 android:textAppearance

Rav*_*avi 7 data-binding android android-databinding

我正在尝试android:textAppearance使用 of进行设置DataBinding,但它不允许我?android:attr/textAppearanceLarge与三元运算符一起使用。

android:textAppearance="@{position==1 ? ?android:attr/textAppearanceLarge : ?android:attr/textAppearanceMedium}"
Run Code Online (Sandbox Code Playgroud)

它向我展示了编译时错误<expr> expected, got '?'

有没有其他方法可以将它与 DataBinding 一起使用?

Lon*_*ger 6

您可以使用 android.R.attr 包而不是 ?android:attr

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="android.R.attr"/>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="hello world"
            android:textAppearance='@{age==1 ? android.R.attr.textAppearanceLarge : android.R.attr.textAppearanceMedium}'
            tools:textAppearance="?android:textAppearanceLarge"
            />


    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用,因为 `android:textAppearance` 需要样式的 `resource Id`,但这里传递的是 `attribute reference`。`android:textAppearance="?android:attr/textAppearanceLarge"` 有效,因为 XML 解析器会为您查找所有给定的 `?attr:...` 到实际的 `resourceId`。但是*它在数据绑定表达式的情况下不起作用* (2认同)

Mar*_*ski 5

你不能直接使用它,但是这是我在这种情况下使用的技巧。使用textAppearanceLargetextAppearanceMedium作为父项创建自己的样式,然后改为设置这些样式:

首先创建Foo样式:

<style name="Foo" parent="TextAppearance.AppCompat.Large">
   ... [whatever you need to set or override ] ...
</style>
Run Code Online (Sandbox Code Playgroud)

并为 for 做同样的事情FooMedium。然后编辑您的布局文件,如下所示。请注意,您必须首先R<data>块中导入项目的类:

<data>
   <import type="<your-package-id>.R"
</data>
Run Code Online (Sandbox Code Playgroud)

最后应用您以前想要的外观:

android:textAppearance="@{ position==1 ? R.style.Foo : R.style.FooMedium }"
Run Code Online (Sandbox Code Playgroud)