【问题标题】:Android DataBinding: can I pass constructor parameter to my data variable?Android DataBinding:我可以将构造函数参数传递给我的数据变量吗?
【发布时间】:2017-05-16 02:01:44
【问题描述】:

我有一个MovieViewModel 类,在我的布局文件中用作变量。

<data>
    <variable
        name="vm"
        type="udacity.nanodegree.android.p2.model.comum.MovieViewModel"/>;

</data>

根据Android Data Binding docs

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

我需要通过布局文件中的构造函数将这个特殊变量 context 传递给我的类:

public class MovieViewModel {
    private Context context;

    public MovieViewModel(Context context) {
        this.context = context;
    }    
}

有没有办法做到这一点?


如果不可能,我想将其传递给我的属性,例如:

<TextView
                    android:id="@+id/text_release"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:padding="2dp"
                    android:text="@{vm.releaseDateFormated(context) ?? ``}"
                    tools:text="0000"/>

MovieViewModel 中使用上下文如下:

public String getReleaseDateFormated (Context context){
    return releaseDate == null? null: context.getString(R.string.dateToYear, releaseDate);

根据这个answer我可以这样做,但我尝试并收到错误:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:cannot find method releaseDateFormated(android.content.Context) in class udacity.nanodegree.android.p2.model.comum.MovieViewModel
file:C:\Users\alexandre\Udacity\Nanodegrees\AndroidDevelopment\P2-PopularMovies\app\src\main\res\layout\fragment_detail.xml
loc:74:40 - 74:70
****\ data binding error ****

【问题讨论】:

    标签: android android-layout android-databinding


    【解决方案1】:

    “有没有办法做到这一点?

    数据绑定框架没有创建MovieViewModel 的实例。因此,当创建MovieViewModel的实例时,构造函数参数是你的工作。

    我试过并收到错误

    您的错误不是来自您问题中的代码。错误指向releaseDateFormated()

    【讨论】:

    • 我明白你说的,你是对的构造函数。但是错误说它没有找到方法(因为上下文参数),不是吗?对不起!对不起!我犯了一个错误,我从另一个字段粘贴了错误。我会更正这个问题,但无论如何都会发生错误。
    • @alexpfx:“但是错误说它没有找到方法(因为上下文参数),不是吗?” -- 好吧,你有一个名为releaseDateFormated() 的方法,它以Context 作为参数吗?
    • 是的 :) 我有几种类似的方法,但我没有看到错误是关于另一种方法的。
    • @alexpfx:您可能需要更新您的问题以显示您的releaseDateFormated() 方法实现。
    • @alexpfx:将其重命名为releaseDateFormated(),或更改布局以引用getReleaseDateFormated()。此方法不是 JavaBeans 样式的 getter 方法,因为它们不带参数。因此,我认为数据绑定框架不会尝试将get 放在方法名称的前面。
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2011-09-05
    • 2018-04-27
    相关资源
    最近更新 更多