android 生成资源id,DataBinding:如何通过动态ID获取资源?

这篇博客探讨了在Android Data Binding中如何通过运行时的ID动态引用资源。作者遇到的问题是在XML布局中无法直接使用`@string/myFormatString(myPojo.resourceId)`来格式化文本,因为Data Binding无法解析整数资源ID。解决方案包括创建自定义的`@BindingAdapter`和使用`BindingUtils`辅助类来获取字符串资源。博客还提到了一些其他尝试但未成功的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我知道可以通过资源ID引用布局中的资源:

android:text="@{@string/resourceName}"

但是,我想通过id引用资源,这只在运行时才知道。 举个简单的例子,想象一下我们有这样的模型:public class MyPOJO { public final int resourceId = R.string.helloWorld; }

现在我需要将此值用作格式字符串中的值。 我们称之为

Value is: %s

最直接的方法不起作用:

android:text="@{@string/myFormatString(myPojo.resourceId)}"

这只会将整数值放入占位符(也certificate我正确地初始化了我的POJO,所以我不在这里提供整个布局)。

我也试过使用@BindingConversion ,但它没有用(实际上是预期的,但我还是尝试过) – int仍被分配给占位符并且没有调用绑定方法。

如何通过DataBinding库中的id显式获取资源?

另一个解决方案是为它创建一个自定义的@BindingAdapter 。

@BindingAdapter({"format", "argId"}) public static void setFormattedText(TextView textView, String format, int argId){ if(argId == 0) return; textView.setText(String.format(format, textView.getResources().getString(argId))); }

然后分别提供variables。

如果你需要多个参数,你可以使用一个数组,但在我的情况下,一个就足够了。

截至2016年6月,这可以用XML:

android:text= "@{String.format(@string/my_format_string, myPojo.resourceId)}"

我最终创建了自己的方法:

public class BindingUtils { public static String string(int resourceId) { return MyApplication .getApplication() .getResources() .getString(resourceId); } }

声明导入:

...

并在绑定期间调用它:

android:text="@{@string/myFormatString(BindingUtils.string(myPojo.resourceId))}"

为此提供开箱即用的方法会很高兴。 DataBinding正处于测试阶段 – 所以也许它将来会出现。

您可以使用:

android:text='@{(id > 0) ? context.getString(id) : ""}'

另一种解决方案是,如果已经在xml中定义了Context ,那么您将不需要导入String类。

android:text="@{@string/myFormatString(context.getString(pojo.res))}"

会为…工作

Value is: %s

如果你的xml中没有上下文。 然后按照这个

并在您的Activity

ActivityUserBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_user); binding.setPojo(new MyPOJO()); binding.setContext(this);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值