Android DataBinding在哪里获取上下文?

61

我有一个用于显示时间的 TextView。我想使用Android的DataBinding插件。

为了格式化时间,我正在使用 DateUtils.formatDateTime(context, int, int) 方法,它需要一个 Context 实例。我可以获得包括 元素在内的上下文吗?还是我必须采用传统的方法?

谢谢


你可以将它作为变量传递给数据绑定。在rc2中,您将拥有与DataBindingComponent相关的其他选项。或者,您可以创建一个操作多个属性的BindingAdapter。 - George Mount
4个回答

106

你可以在视图中使用当前视图context作为参数来执行类似以下的操作。

...
android:text="@{yourModelHere.yourModelMethodHere(context)}"
...

3
你从哪里得到的? - dominik4142
27
您可以在此处查看:http://developer.android.com/intl/es/tools/data-binding/guide.html#variables。将生成一种特殊变量以供在绑定表达式中使用,该变量名为"context"。context的值源自根视图的getContext()方法返回的Context。如果使用具有相同名称的显式变量声明,则context变量将被覆盖。 - epool
有没有关于Activity的特殊词汇? - Muhammad Younas
@MuhammadYounas,Activity 没有特殊的单词,为什么你想要在 XML 中使用它?如果你真的需要它,你可以将上下文转换为视图所在的 Activity,但我不确定这是否是一个好的做法。 - epool

51

我认为我应该回答而不是发表评论。在发布rc2版本时,您将拥有更多选项。在rc1中,您可以将上下文传递到变量中绑定,然后将其作为参数传递给方法。或者,您可以为数据绑定创建自定义属性:

@BindingAdapter({"timeMillis", "dateFlags"})
public static void setDateText(TextView view, int timeMillis, int dateFlags) {
    view.setText(DateUtils.formatDateTime(view.getContext(), timeMillis,
                 dateFlags));
}

然后在您的TextView中使用它:

<TextView ... app:timeMillis="@{timeVar}" app:dateFlags="@{dateFlags}"/>

有更好的解决方案吗?我有一个类似的情况,需要上下文(我需要格式化字符串的本地化值),想知道如何让框架提供它。我已经实现了这个解决方案,它可以工作,但失去了数据绑定所提供的很多清晰度。编辑:这个提交是我正在处理的。 - Adam S
16
现在可以将上下文作为自动变量“context”使用。然而,针对您的特定需求,有更好的解决方案。字符串格式化是表达式语言的一部分,因此可以使用类似于@{@string/myformat(var1, var2)}的内容。 - George Mount
太好了,谢谢!我今晚会尝试一下。有没有地方可以关注这些更改?文档中没有提到这一点,我也很难找到任何更改日志。 - Adam S
@GeorgeMount,我还没有理解你的答案,请帮我在我的问题中回答。谢谢 :( http://stackoverflow.com/questions/42881529/full-example-or-tutorial-about-how-to-get-context-from-data-binding-android - Hien Nguyen

19

一个名为context的特殊变量会在需要时生成,用于绑定表达式。context的值是从根视图的getContext()方法获取的上下文。如果有同名的显式变量声明,那么context变量将被覆盖。

换句话说,每次需要传递context时,只需使用"context",例如@{Object.method(context)}


-1

使用字符串资源,请使用以下方法

this.yourView.getRoot().getResources().getString(R.string.your_string)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接