数据绑定:如何将xml中的Context传递给方法?

时间:2017-11-29 08:54:18

标签: android android-databinding

Android Studio 3.0。

这是我的自定义方法:

public static int getTileWidthDpInScreen(Context context) {
    // some code here
    return tileWidthDp;
}

这里是带有数据绑定代码的xml文件:

<?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="com.myproject.android.customer.util.GUIUtil" />

    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/imageViewPhoto"
            android:layout_width="@{GUIUtil.getTileWidthDpInScreen()}"
            android:layout_height="@dimen/preview_image_height"
            android:scaleType="centerCrop"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />       


    </android.support.constraint.ConstraintLayout>

</layout>

结果我得到错误:

e: java.lang.IllegalStateException: failed to analyze: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
data binding error msg:cannot find method getTileWidthDpInScreen() in class com.myproject.android.customer.util.GUIUtil

此错误是因为我未在方法getTileWidthDpInScreen()中传递上下文。

如何在xml中获取上下文并将其传递给方法:getTileWidthDpInScreen()

2 个答案:

答案 0 :(得分:1)

Android documentation说:

  

将生成一个名为context的特殊变量,用于绑定   根据需要的表达式。上下文的值是Context对象   从根视图的getContext()方法中获取。 context变量是   被具有该名称的显式变量声明覆盖。

因此解决方案是: android:layout_width="@{GUIUtil.getTileWidthDpInScreen(context)}

答案 1 :(得分:0)

您只需要在XML数据导入中导入<import type="android.content.Context" />

然后,您只需使用context即可访问数据绑定的上下文。

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

    <data>
        <import type="android.content.Context" />

        <import type="com.myproject.android.customer.util.GUIUtil" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/imageViewPhoto"
            android:layout_width="@{GUIUtil.getTileWidthDpInScreen(context)}"
            android:layout_height="@dimen/preview_image_height"
            android:scaleType="centerCrop"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>