如何使用Android DataBinding动态更改android:layout属性?

Bre*_*ett 1 java data-binding layout android

我有XML布局代码:

<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="info" type="com.mycompany.orm.binders.MyBinderObject"/>
    </data>

    <android.support.percent.PercentRelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="15dp"
        android:paddingBottom="15dp"
        android:gravity="end">

    ...
Run Code Online (Sandbox Code Playgroud)

这很有效.但是,我MyBinderObject调用了一个属性mygravity,并将其设置为两个字符串之一:startend.我试图找出如何读取数据绑定属性mygravity以将重力分配给布局.

即,android:gravity="@{info.mygravity}"(但是,这行不起作用.编译时数据绑定代码失败).

有没有人知道如何android:gravity基于数据绑定对象属性动态设置?

Com*_*are 5

我在MyBinderObject中有一个名为mygravity的属性,它被设置为两个字符串之一:start或end.

其中存在的问题是:你正在做一些合理的事情并将布局XML视为XML.

布局XML属性值可以是各种类型.有时,这很明显,例如android:enabled="false"android:layout_width="30sp".并且,有时,类型实际上是字符串或字符串资源引用(例如,android:text="Foo").但有时属性值看起来像英语字符串,但它实际上是一组枚举值(例如,重力值)之一.

我没有意识到引力实际上是一个枚举属性

根据经验,粗切规则:如果你翻译的价值成另一种语言的生成会失败,那么它是一个枚举属性(例如,android:gravity="fin"而不是android:gravity="end",假设谷歌翻译给我合理的西班牙语那里...).如果翻译的值可以正常工作,那么它是任何有效的字符串或(通常)字符串资源.

我试图找出如何读取数据绑定属性mygravity以将重力分配给布局.

你必须将字符串值变换为等效的Gravity常量Gravity.START.