Android无法解析枚举值

时间:2015-07-02 08:44:40

标签: java android xml android-layout enums

我想要在视图中使用这些资源。

<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);

因此,为了重现这一点,您必须:

  1. 创建视图,添加枚举属性
  2. 在布局中使用此属性的任何值(应该失败)
  3. 根据需要重建项目多次(仍应失败)
  4. 从View构造函数访问枚举(应该停止失败)
  5. 如果这不能重现问题,那么我的问题毫无意义,可以安全删除

    顺便说一下,我正在跑步:

    • android-studio 1.2.2
    • gradle 2.2.1
    • oracle JDK 1.8.0_45
    • Ubuntu 15.04_amd64

1 个答案:

答案 0 :(得分:0)

当java说“无法解析”时,通常意味着该变量的点引用不存在,或者被错误引用。

我的建议(可能有效)是确保所有对“P1”(来自Enum)的引用都设置为“P1”而不是“p1”。对“P2”做同样的事情,这可能会解决问题。

另外,如果你想看看这个:Variable Structuring Help.

希望这有帮助。