如何使用数据绑定在relativelayout中设置layout_centerVertical

时间:2018-06-19 06:10:01

标签: android android-databinding

假设我的视图可能是RelativeLayout中心垂直对齐的视图。我想使用数据绑定来实现这一目标。

android:layout_centerVertical="@{data.shouldCenter ? true : false}"

我使用上述内容获得data binding error ****msg:Identifiers must have user defined types from the XML file. center is missing it ****\ data binding error ****。我应该如何让它工作?

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

    <data>

        <import type="android.view.View" />

        <variable
            name="data"
            type="com.test.MainViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data.title}"
            android:layout_centerVertical="@{data.shouldCenter ? true : false}"
            android:textColor="@{data.titleTextColor}"
            android:visibility="@{data.title != null ? View.VISIBLE : View.GONE}" />

        <TextView
            android:id="@+id/msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/title"
            android:layout_marginLeft="@dimen/marginLarge"
            android:layout_marginTop="@dimen/marginSmall"
            android:text="@{data.message}"
            android:visibility="@{data.message != null ? View.VISIBLE : View.GONE}" />

    </RelativeLayout>
</layout>

2 个答案:

答案 0 :(得分:1)

你必须打电话给方法。不要在数据绑定中使用直接变量。所以你必须用下面的代码替换你的代码。

 android:layout_centerVertical="@{data.shouldCenter() ? true : false}"

你必须在你的模型上创建getter方法,如下所示:

boolean shouldCenter;

public boolean shouldCenter() {
    return shouldCenter;
}

这对我有用。检查一下,看看它是否有效!

答案 1 :(得分:1)

我有另一个解决方案,即使用BindingAdapter

@BindingAdapter(" android:layout_centerVertical")
public static void setCenterVertical(View view, boolean isCenterVertical) {
    RelativeLayout.LayoutParams layoutParams =
            (RelativeLayout.LayoutParams) view.getLayoutParams();
    layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT,
            isCenterVertical ? RelativeLayout.TRUE : 0);
    view.setLayoutParams(layoutParams);
}

并将其用作:

<TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data.title}"
            android:layout_centerVertical="@{data.shouldCenter}"
            android:textColor="@{data.titleTextColor}"
            android:visibility="@{data.title != null ? View.VISIBLE : View.GONE}" />

希望这会有所帮助