Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
575 views
in Technique[技术] by (71.8m points)

exception - Android UnsupportedOperationException: Can't convert to color: type=0x2

This is the crashlog from 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

So for what I can see the problem is in

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

Where I have this line of code:

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

This is the complete function

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);
    }

This is the content of the 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>

I think that the problem is in the TextView. The style of that textview cannot be a problem because comes directly from Android so I don't think this will be a problem.

The android:textColor="@color/orange_mxm" is this in my colors.xml

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

This is the Dialog.MXM style

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

And I don't think this is a so not-standard color...

Where's the problem? How can I solve this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Does the Dialog.MXM style vary with the API level supported by the device (e.g. using a values-v14/ directory) or is it used for all devices?

The DeviceDefault theme family (including Theme.DeviceDefault.Dialog) was added in API 14 (Android 4.0, ICS) and will not be present on older devices. This means that on those devices where that theme cannot be found, Dialog.MXM in effect has a null parent theme. Themes expect a number of attributes to have defined values, and in this case your theme will be missing many required ones. Some devices may deal with this more gracefully than others.

One solution is to define a common base theme that inherits from a different parent based on which platform version the device is running. An example:

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" />
[...]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...