我有第一类的变量,例如:

MyClass{
    companion Object{
        @JvmField val foo = mapOf("a" to "b")
    }
}


当我从另一个类调用它时:

setBackgroundColor(Color.parseColor(MyClass.foo["..."]));


出现错误,提示“期望的数组类型;找到:'java.util.map
'“
问题是什么?

请注意,如果我在MyClass中进行相同的调用,则效果很好

这些是错误:
java - 预期的数组类型;找到:'java.util.map <java.lang.String,java.lang.String>'-LMLPHP

这是我真正的数组值:

companion object{
    @JvmField val darkMode = mapOf(
        "bgColor" to "#000000",
        "cardColor" to "#262626"
    )
}


当我从扩展RecyclerView.ViewHolder的类中调用该错误时
java - 预期的数组类型;找到:'java.util.map <java.lang.String,java.lang.String>'-LMLPHP

最佳答案

我只是试过这个:

        val foo = mapOf("a" to "Red")
        someView.setBackgroundColor(Color.parseColor(foo["a"]))


而且效果很好,您能否分享有关该异常的更多详细信息?

更新资料

我尝试完全按照书面规定使用您的MyClass,但我已将a的值替换为Red而不是您的b字符串。

您是否正确使用parseColor

    /**
     * </p>Parse the color string, and return the corresponding color-int.
     * If the string cannot be parsed, throws an IllegalArgumentException
     * exception. Supported formats are:</p>
     *
     * <ul>
     *   <li><code>#RRGGBB</code></li>
     *   <li><code>#AARRGGBB</code></li>
     * </ul>
     *
     * <p>The following names are also accepted: <code>red</code>, <code>blue</code>,
     * <code>green</code>, <code>black</code>, <code>white</code>, <code>gray</code>,
     * <code>cyan</code>, <code>magenta</code>, <code>yellow</code>, <code>lightgray</code>,
     * <code>darkgray</code>, <code>grey</code>, <code>lightgrey</code>, <code>darkgrey</code>,
     * <code>aqua</code>, <code>fuchsia</code>, <code>lime</code>, <code>maroon</code>,
     * <code>navy</code>, <code>olive</code>, <code>purple</code>, <code>silver</code>,
     * and <code>teal</code>.</p>
     */
    @ColorInt
    public static int parseColor(@Size(min=1) String colorString) {
        if (colorString.charAt(0) == '#') {
            // Use a long to avoid rollovers on #ffXXXXXX
            long color = Long.parseLong(colorString.substring(1), 16);
            if (colorString.length() == 7) {
                // Set the alpha value
                color |= 0x00000000ff000000;
            } else if (colorString.length() != 9) {
                throw new IllegalArgumentException("Unknown color");
            }
            return (int)color;
        } else {
            Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
            if (color != null) {
                return color;
            }
        }
        throw new IllegalArgumentException("Unknown color");
    }


更新2:

好的,您说过“扩展RecyclerView.ViewHolder的类”,但是说该类只是RecyclerView类中的一个抽象类,因此其中没有setBackgroundColor,除非您执行以下操作:

yourViewHolderInstance.itemView.setBackgroundColor

那么setBackgroundColor的签名是什么?

看起来像public void setBackgroundColor(@ColorInt int color) {吗?

我只是将此添加到我的应用中只是为了好玩:

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as BaseViewHolder).bind(getItem(position))

// For Filippo :)
holder.itemView.setBackgroundColor(Color.parseColor(MyClass.foo["a"]))
    }


好吧...现在看起来一切都非常红。 :)

更新3

好的,所以根据您的上一次更新,您是从Java调用此函数,因此无法使用Kotlin语法...

做这个:

        final Map<String, String> foo = MyClass.foo;
        yourView.setBackgroundColor(Color.parseColor(foo.get("a")));


显然,您可以避免进行中间分配,并寻求:

        v.setBackgroundColor(Color.parseColor(MyClass.foo.get("a")));


我通常更喜欢前者,尤其是当您给它起所有有意义的名称并需要调试时,但是就我而言,这并没有真正的区别。

09-04 12:45