Android UnsupportedOperationException: невозможно преобразовать в цвет: type = 0x2 - PullRequest
6 голосов
/ 07 марта 2012

Это аварийный журнал с Android Market:

android.view.InflateException: Binary XML file line #8: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:596)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:644)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
at com.designfuture.music.ui.dialog.MXMDialog.<init>(MXMDialog.java:73)
at com.designfuture.music.ui.dialog.MXMDialog.<init>(MXMDialog.java:58)
at com.designfuture.music.model.MXMStoreBuy.getBuyDialog(MXMStoreBuy.java:70)
at com.designfuture.music.ui.fragment.plbl.XLBLFragment$ViewHolder$3.onClick(XLBLFragment.java:290)
at android.view.View.performClick(View.java:3110)
at android.view.View$PerformClick.run(View.java:11934)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4123)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:416)
at android.view.LayoutInflater.createView(LayoutInflater.java:576)
... 22 more
Caused by: java.lang.UnsupportedOperationException: Can't convert to color: type=0x2
at android.content.res.TypedArray.getColor(TypedArray.java:326)
at android.widget.TextView.<init>(TextView.java:422)
at android.widget.TextView.<init>(TextView.java:364)
... 25 more

Итак, что я вижу, проблема в

at com.designfuture.music.ui.dialog.MXMDialog.<init>(MXMDialog.java:73)

Где у меня есть эта строка кода:

mHolder = new ViewHolder((ViewGroup) inflater.inflate(R.layout.dialog_mxm, null));

Это полная функция

public MXMDialog(Context context, String title) {
        super( context, R.style.Dialog_MXM );

        //getWindow()
        LayoutParams lp= getWindow().getAttributes();
        lp.gravity = Gravity.CENTER;
        lp.dimAmount = 0.5f;
        lp.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL;

        if(inflater == null)
            inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        mHolder = new ViewHolder((ViewGroup) inflater.inflate(R.layout.dialog_mxm, null));
        super.setContentView(mHolder.root);

        if(title != null)
            setTitle(title);
    }

Это содержимое R.layout.dialog_mxm

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@android:id/title"
        android:background="@drawable/tabwidget"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:gravity="left"
        android:paddingLeft="10dp"
        android:textStyle="bold"
        android:textColor="@color/orange_mxm"
        style="@android:style/TextAppearance.Large"/>

    <FrameLayout
        android:id="@android:id/content"
        android:background="@drawable/tabwidget"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Я думаю, что проблема в TextView.Стиль этого текстового представления не может быть проблемой, потому что он исходит непосредственно из Android, поэтому я не думаю, что это будет проблемой.

Андроид: textColor = "@ color / orange_mxm" это в моем colors.xml

<color name="orange_mxm">#FFff6500</color>

Это стиль Dialog.MXM

<!-- DIALOG -->

    <style name="Dialog.MXM" parent="@android:style/Theme.DeviceDefault.Dialog">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@style/Dialog.MXM.FadeAnimation</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:gravity">center</item>
    </style>

    <style name="Dialog.MXM.FadeAnimation">
        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>

И я не думаю, что это такой нестандартный цвет ...

Гдепроблема?Как я могу решить это?

Ответы [ 3 ]

11 голосов
/ 13 марта 2012

Меняется ли стиль Dialog.MXM в зависимости от уровня API, поддерживаемого устройством (например, с использованием каталога values-v14 /), или он используется для всех устройств?

Семейство тем DeviceDefault (включая Theme.DeviceDefault.Dialog) было добавлено в API 14 (Android 4.0, ICS) и не будет присутствовать на старых устройствах. Это означает, что на тех устройствах, где эта тема не может быть найдена, у Dialog.MXM фактически отсутствует родительская тема. Темы ожидают, что ряд атрибутов будут иметь определенные значения, и в этом случае вашей теме будет не хватать многих необходимых. Некоторые устройства могут справляться с этим более изящно, чем другие.

Одним из решений является определение общей базовой темы, которая наследуется от другого родителя в зависимости от версии платформы, на которой работает устройство. Пример:

разреш / значения / themes.xml:

[...]
<!-- Use the legacy dialog theme as a base on older devices -->
<style name="Dialog.Base" parent="@android:style/Theme.Dialog" />

<!-- Dialog.Base varies with platform version -->
<style name="Dialog.MXM" parent="@style/Dialog.Base">
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowAnimationStyle">@style/Dialog.MXM.FadeAnimation</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:gravity">center</item>
</style>
[...]

RES / значения-V11 / themes.xml:

[...]
<!-- Use Holo dialogs as the base on Honeycomb -->
<style name="Dialog.Base" parent="@android:style/Theme.Holo.Dialog" />
[...]

Рез / значения-v14 / themes.xml:

[...]
<!-- Use DeviceDefault dialogs as the base on ICS and newer -->
<style name="Dialog.Base" parent="@android:style/Theme.DeviceDefault.Dialog" />
[...]
1 голос
/ 14 ноября 2016

Я получал эту ошибку в одном из моих модулей.Вот описание проблемы:

есть элемент цвета для 'белого' цвета, определенный в colors.xml основного модуля приложения.

<color name="white">#ffffff</color>

И в одной из схем моего модуля яЯ имею в виду белый цвет:

<TextView 
android:textColor="@color/white"
.../>

Ошибка, которую я сделал, я снова определил цвет элемента 'white' в файле color.xml моего модуля как

**<color name="white">@color/white</color>**

Вместо этогоЭто должно было быть похоже на

<color name="white">#ffffff</color>.

Это была моя проблема.

Спасибо, Ракеш

0 голосов
/ 22 марта 2017

Я получил это исключение, но по другой причине. Я пытался ссылаться на пользовательский атрибут из селектора drawable. Это известная проблема на устройствах до Lollipop, как объяснено здесь и здесь .

В случае, если кому-то нужно сделать это (и сохранить обратную совместимость), одним из обходных путей является переключение тем, определение отдельного рисунка для каждой темы и создание настраиваемого атрибута для рисования в attrs.xml. Пример приведен в принятом ответе в первой ссылке выше.

Это ужасно ужасно, но если у кого-то есть лучшие предложения, я буду рад их услышать.

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