我想要在视图中使用这些资源。
<resources>
<declare-styleable name="ChipView">
<attr name="chip_owner" format="enum">
<enum name="p1" value="0"/>
<enum name="p2" value="1"/>
</attr>
</declare-styleable>
</resources>
另外,我有一个java enum来将其映射到
public enum Player {
P1, P2;
/**
* Returns the opponent of this player
*
* @return the opponent of this player
*/
public Player opponent() {
if (this == P1)
return P2;
else
return P1;
}
}
但是当我将视图添加到相应的布局时,它无法解析枚举值的标签:
<spacebar.backgammoid.ChipView
android:id="@+id/c4"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:chip_owner="p1" /> <!-- Here -->
Android工作室告诉我: 无法解析符号'p1' 验证Android XML文件中的资源引用
我尝试清理并重建我的项目,但没有成功,我也尝试添加这样的资源:
<resources>
<attr name="chip_owner" format="enum">
<enum name="p1" value="0"/>
<enum name="p2" value="1"/>
</attr>
<declare-styleable name="ChipView">
<attr name="chip_owner" />
</declare-styleable>
</resources>
但这都没有达到我的预期。
我做错了吗?我发现了一些关于这个主题的问题,但似乎没有任何问题让android解析标签。
这是问题的一部分,因为它不是真正的答案。
当我第一次以编程方式访问枚举时,此问题自行解决了:
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ChipView);
int player = a.getInt(R.styleable.ChipView_chip_owner, 0);
if (player == 0)
this.setOwner(Board.Player.P1);
else
this.setOwner(Board.Player.P2);
a.recycle();
}
现在,如果我删除此代码,它仍然可以解析p1,因此在后台永久更改了某些内容。
所以,问题毫无意义,因为它已经制定,但我仍然想知道为什么它失败了,我通过访问类中的值来触发了什么变化(出现的值)一旦我使用
访问属性,就在自动完成中context.obtainStyledAttributes(attrs, R.styleable.ChipView);
因此,为了重现这一点,您必须:
如果这不能重现问题,那么我的问题毫无意义,可以安全删除
顺便说一下,我正在跑步:
答案 0 :(得分:0)
当java说“无法解析”时,通常意味着该变量的点引用不存在,或者被错误引用。
我的建议(可能有效)是确保所有对“P1”(来自Enum)的引用都设置为“P1”而不是“p1”。对“P2”做同样的事情,这可能会解决问题。
另外,如果你想看看这个:Variable Structuring Help.
希望这有帮助。