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

时间:2016-11-09 23:21:25

标签: java android layout data-binding

我有 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">

    ...

这很有效。但是,我在MyBinderObject内有一个名为mygravity的属性,它被设置为两个字符串之一:startend。我试图弄清楚如何阅读数据绑定属性mygravity以将重力分配给布局。

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

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

2 个答案:

答案 0 :(得分:5)

  

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

存在的问题是:您正在做一些合理的事情,并将布局XML视为XML。

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

  

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

粗略的经验法则:如果将值翻译成另一种语言,如果构建失败,则它是枚举属性(例如,android:gravity="fin"而不是android:gravity="end",假设Google翻译给了我合理的西班牙语......)。如果翻译的值可以正常工作,那么它就是任何有效的字符串或(通常)字符串资源。

  

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

您必须将字符串值变换为等同的Gravity常量,如Gravity.START

答案 1 :(得分:-1)

你绝对可以在布局文件中使用android:gravity="@{info.mygravity}",但要确保mygravity应该是int值。

你应该参考this

如果您想要center重力,info.mygravity的值应为Gravity.CENTER