【问题标题】:Android UnsupportedOperationException: Can't convert to color: type=0x2Android UnsupportedOperationException:无法转换为颜色:type=0x2
【发布时间】:2012-03-07 08:55:28
【问题描述】:

这是来自 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 中。 该 textview 的样式不会有问题,因为它直接来自 Android,所以我认为这不会有问题。

我的 colors.xml 中的 android:textColor="@color/orange_mxm" 是这个

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

而且我不认为这是一种非常不标准的颜色......

问题出在哪里?我该如何解决这个问题?

【问题讨论】:

  • 为 Dialog.MXM 发布您的样式 xml。
  • 我的 minSdkVersion 是 7 (android 2.1)

标签: android exception android-layout


【解决方案1】:

Dialog.MXM 样式是否随设备支持的 API 级别而变化(例如,使用 values-v14/ 目录)还是用于所有设备?

DeviceDefault 主题系列(包括 Theme.DeviceDefault.Dialog)已添加到 API 14(Android 4.0、ICS)中,并且不会出现在旧设备上。这意味着在那些无法找到该主题的设备上,Dialog.MXM 实际上有一个空父主题。主题期望许多属性具有定义的值,在这种情况下,您的主题将缺少许多必需的属性。有些设备可能比其他设备更优雅地处理这个问题。

一种解决方案是定义一个通用的基本主题,该主题根据设备运行的平台版本从不同的父级继承。一个例子:

res/values/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/values-v11/themes.xml:

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

res/values-v14/themes.xml:

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

【讨论】:

    【解决方案2】:

    我在我的一个模块中遇到了这个错误。这是问题描述:

    在主应用模块的colors.xml中定义了一个“白色”颜色项。

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

    在我的模块的其中一个布局中,我将白色称为:

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

    我犯的错误是我在模块的 color.xml 中再次将项目颜色“白色”定义为

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

    应该是这样的

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

    那是我的问题。

    谢谢, 拉克什

    【讨论】:

      【解决方案3】:

      我得到了这个例外,但出于不同的原因。我试图从选择器可绘制对象中引用自定义属性。如herehere 所述,这是棒棒糖前设备上的一个已知问题。

      如果有人需要这样做(并保持向后兼容性),一种解决方法是切换主题,为每个主题定义单独的可绘制对象,并在 attrs.xml 中为可绘制对象创建自定义属性。 上面第一个链接中接受的答案中给出了一个示例。

      这很丑陋,但如果有人有更好的建议,我很乐意“听到”他们。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多