Ожидается тип массива;найдено: 'java.util.map' - PullRequest
0 голосов
/ 06 октября 2019

У меня есть переменная первого класса, например:

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

И когда я вызываю ее из другого класса, например:

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

, появляется сообщение об ошибке "Ожидается тип массива; найдено: 'java.util.map ' "В чем проблема?

Обратите внимание, что если я делаю тот же вызов в MyClass, он отлично работает

Это ошибки: enter image description here

Это мои реальные значения массива:

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

Ошибка возникает, когда я звонюэто из класса, который расширяется RecyclerView.ViewHolder enter image description here

1 Ответ

2 голосов
/ 06 октября 2019

Я только что попробовал это:

        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 ...

Doэто:

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

Очевидно, что вы можете избежать промежуточного назначения и перейти к:

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

Я обычно предпочитаю первое, особенно если вы даете ему все значимые имена и нуждаетесь в отладке,но нет никакой разницы, насколько я понимаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...