gpt4 book ai didi

java - 如何在Android Layout中按值而不是名称设置枚举属性?

转载 作者:IT老高 更新时间:2023-10-28 23:14:45 28 4
gpt4 key购买 nike

我有一个自定义 View 持有另一个。层次结构:

MyOuterView
->MyInnerView

MyInnerView 有一个枚举属性,例如:

<attr name="myAttr" format="enum">
<enum name="foo" value="0"/>
<enum name="bar" value="1"/>
</attr>

所以我可以在 MyOuterView XML 中实例化组件,例如:

<com.example.MyInnerView
....
app:myAttr="foo"/>

当然可以。MyOuterView 为自定义本身提供了一个参数。基于这个参数,我想设置 MyInnerView 的参数。

希望的行为是我可以像这样使用数据绑定(bind):

<com.example.MyInnerView
....
app:myAttr="@{data.getMyAttr()}"/>

其中 getMyAttr() 看起来像:

public int getMyAttr() {
return myAttr; // returns 0 or 1
}

结果是编译问题。

****/ data binding error ****msg:Cannot find the setter for attribute 'app:myAttr' with parameter type int on com.example.MyInnerView

所以显然我不能按值设置枚举,只能按名称设置。除了以编程方式创建 MyInnerView 之外还有什么想法吗?请注意,我无法更改 MyInnerView

最佳答案

I can't set the enum by value but only by name

这并不完全正确。即使按名称,您也无法使用 DataBinding 设置值,问题是 xml 中定义的属性的值通过构造函数传递给 ViewView 可以同时具有属性和 setter ,但不一定如此。例如,您是否为 TextViewandroid:text 设置了一个值,该值设置为 com.android.internal.R.styleable.TextView_text 然后从构造函数中的 AttributeSet 中检索。如果使用DataBinding,会调用setText(),但这是两个完全不同的东西,功能相同,但在代码中没有关联。

鉴于您无法修改 MyInnerView 并且没有可以为 myAttr 调用的 setter ,您唯一的选择是将其传递给构造函数。 DataBinding 根本不可行,即使使用 BinderAdapter 您也无法在 AttributeSet 中设置值,因为此时 View 已经实例化了。

选项 1 - 主题

定义一个新属性

<attr name="MyInnerViewAttrValue" format="integer" />

然后用样式解析这个属性,例如你可以有

<style name="AppTheme.Foo">
<item name="MyInnerViewAttrValue">0</item>
</style>

<style name="AppTheme.Bar">
<item name="MyInnerViewAttrValue">1</item>
</style>

在布局xml中设置

<com.example.MyInnerView
...
app:myAttr="?attr/MyInnerViewAttrValue" />

然后在实例化 View 之前在Activity中调用setTheme(int)

选项 2 - 自定义 BindingAdapter

如果你想设置你的值 DataBinding(因为你有一个 setter,或者因为你想用反射破解 MyInnerView)那么你需要创建一个自定义的 BindingAdapter,例如

@BindingAdapter("myAttrValue")
public static void setMyAttr(MyInnerView myInnerView, int value) {
switch (value) {
case 0:
myInnerView.foo();
break;
default:
myInnerView.bar();
}
}

然后在布局xml中

<com.example.lelloman.dummy.MyInnerView
...
myAttrValue="@{model.attr}" />

并从您的 ViewModel 中给出 int

public class MyInnerViewModel {

public int getAttr() {
return 1234;
}
}

关于java - 如何在Android Layout中按值而不是名称设置枚举属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48747586/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com