Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从值中获取可设置样式的枚举名称_Java_Android_Enums_Declare Styleable - Fatal编程技术网

Java 从值中获取可设置样式的枚举名称

Java 从值中获取可设置样式的枚举名称,java,android,enums,declare-styleable,Java,Android,Enums,Declare Styleable,这不是关于enum的无数次的问题 我将枚举定义为styleable属性的一部分(对于自定义小部件) 但是这不起作用,a.getString(…)返回“1”,它是“RGB”的值 我得到一个抛出的异常mColorMode被赋值为null,因为: ColorMode.valueOf("1") == null 而不是 ColorMode.valueOf("RGB") == ColorMode.RGB 注意: 我想强调的是,ColorMode不是导致问题的enum,我需要从中获取名称的enum是问题顶

这不是关于enum的无数次的问题

我将枚举定义为styleable属性的一部分(对于自定义小部件)

但是这不起作用,
a.getString(…)
返回
“1”
,它是“RGB”的值 我得到一个抛出的异常
mColorMode
被赋值为
null
,因为:

ColorMode.valueOf("1") == null
而不是

ColorMode.valueOf("RGB") == ColorMode.RGB
注意
我想强调的是,ColorMode不是导致问题的
enum
,我需要从中获取名称的enum是问题顶部的一个,用XML声明。是的,它们具有相同的名称,但我不能指望它们具有相同的数值。

您应该尝试实现一种方法,通过int检索枚举值,如下所述:

或者对于懒惰的人:

public static enum ColorMode {
    RGB("1"), HSV("2"), CMYK("3")

    private String key;

    private static final Map<String, ColorMode> STRING_TO_ENUM = new HashMap<String, ColorMode>();

    static {
        for (ColorMode clrMode : ColorMode.values) {
            STRING_TO_ENUM.put(clrMode.key, clrMode);
        }
    }

    private ColorMode(String key) {
        this.key = key;
    }

    public ColorMode getByKey(String key) {
        return STRING_TO_ENUM.get(key);
    }   
};
公共静态枚举颜色模式{
RGB(“1”)、HSV(“2”)、CMYK(“3”)
私钥;
私有静态最终映射字符串_TO_ENUM=new HashMap();
静止的{
for(ColorMode clrMode:ColorMode.values){
字符串_TO _ENUM.put(clrMode.key,clrMode);
}
}
专用颜色模式(字符串键){
this.key=key;
}
公共颜色模式getByKey(字符串键){
将字符串_返回给_ENUM.get(key);
}   
};
然后,您可以使用方法getByKey而不是方法valueOf来检索枚举的值。

(回答错误后) 我没有好答案,你得把它编出来

    int ordinal = a.getInt(R.styleable.ColorPickerPreference_colorMode);
    mColorMode = ColorMode.values().get(ordinal ^ 1);

这在很大程度上依赖于XML中的特殊编号,交换位0,并获取枚举的顺序。

在您的帖子中,不清楚如何将其应用于声明为属性的枚举,如我所述。请发布能起作用的代码。我不会做这项工作。如果你读不到另一篇文章中的3行Java,那就自己读吧。我读了你的文章,你用的是Java定义的枚举,而不是XML。事实上,它不能解决我的问题,我也不知道如何“翻译”你的代码来让它工作。所以,如果你知道答案,请明确地说出来。这是一个帮助论坛,不是自我论坛。@ilomambo我同意Julien的观点,他给了你一个关于ro如何从int映射到enum的答案,你还需要什么就可以了。在构造函数中指定XML值@朱利安:我会编辑答案,删除大写的幽默,欢迎在StackOverflow中回答。只要看看android source oode是如何实现android:orientation或android:gravity@pskink我看了源代码。没有一致的方法,但据我所知,android编码人员确实依赖于将其资源枚举(XML中的attr)与java常量(java源代码)一样编号。在我看来,这是一扇为bug敞开的大门。这不能用不同的方式来完成,因为在attrs.xml中,您将value=定义为int而不是stringyes我也看到了,或者类似的apkmanager,当然,当aapt生成二进制形式枚举的xml文件不是字符串时-解压.apk并查看res/layout/something.xml也阅读这篇不错的文章您的提案没有编译,
valueOf()
需要一个
String
参数,而不是
int
。无论如何,在我看来,
R.styleable.ColorPickerPreference\u colorMode
指向属性容器,而不是它的值。我很惭愧,:)。把答案改成有用的。谢谢,我一直在努力避免。但如果没有其他选择,我将使用临时相关编号。
ColorMode.valueOf("RGB") == ColorMode.RGB
public static enum ColorMode {
    RGB("1"), HSV("2"), CMYK("3")

    private String key;

    private static final Map<String, ColorMode> STRING_TO_ENUM = new HashMap<String, ColorMode>();

    static {
        for (ColorMode clrMode : ColorMode.values) {
            STRING_TO_ENUM.put(clrMode.key, clrMode);
        }
    }

    private ColorMode(String key) {
        this.key = key;
    }

    public ColorMode getByKey(String key) {
        return STRING_TO_ENUM.get(key);
    }   
};
    int ordinal = a.getInt(R.styleable.ColorPickerPreference_colorMode);
    mColorMode = ColorMode.values().get(ordinal ^ 1);