android.graphics.drawable.ColorDrawable cannot be

2020-02-20 05:36发布

问题:

I tried to use CardView in my Application which worked pretty good within my xml Layout. Since I want to generate them in my code and not via xml I tried to set the radius with CardView.setRadius()-Method as suggested by Android Developers (https://developer.android.com/preview/material/ui-widgets.html#cardview).

This does not work at all! I hope someone can help me, with my problem or got a nice workaround with xml layouts.

This is my code:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
        float radius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics());

        for (String color : colors) {
            CardView card = new CardView(getActivity());
            TextView text = new TextView(getActivity());
            card.setBackgroundColor(Color.parseColor("#"+color));
            card.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, height));
            card.setRadius(radius); //Error!!
            text.setText(args.get(colors.indexOf(color)) + " - #" + color);
            card.addView(text);
            group.addView(card);
        }

This is my Log:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.brobox.materialcolorpalette/com.brobox.materialcolorpalette.MainActivity}: java.lang.ClassCastException: android.graphics.drawable.ColorDrawable cannot be cast to android.support.v7.widget.RoundRectDrawableWithShadow
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5146)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassCastException: android.graphics.drawable.ColorDrawable cannot be cast to android.support.v7.widget.RoundRectDrawableWithShadow
            at android.support.v7.widget.CardViewEclairMr1.setRadius(CardViewEclairMr1.java:76)
            at android.support.v7.widget.CardView.setRadius(CardView.java:89)
            at com.brobox.materialcolorpalette.ColorFragment.onCreateView(ColorFragment.java:61)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:571)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
            at android.app.Activity.performStart(Activity.java:5241)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5146)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
            at dalvik.system.NativeStart.main(Native Method)

UPDATE: I use the new Lollipop SDK now with Appcompat version 21. Now It does not work at all even, when I try it without setRadius().

New Log:

java.lang.ClassCastException: android.graphics.drawable.ColorDrawable cannot be cast to android.support.v7.widget.RoundRectDrawableWithShadow
            at android.support.v7.widget.CardViewEclairMr1.getShadowBackground(CardViewEclairMr1.java:148)
            at android.support.v7.widget.CardViewEclairMr1.getMinWidth(CardViewEclairMr1.java:139)
            at android.support.v7.widget.CardView.onMeasure(CardView.java:181)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:16521)
            at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1226)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.widget.ScrollView.onMeasure(ScrollView.java:326)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:16521)
            at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:848)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2552)
            at android.view.View.measure(View.java:16521)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1915)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5603)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5146)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
            at dalvik.system.NativeStart.main(Native Method)

Update 2: I guess this is a bug by google. So I pointed it out for them: https://code.google.com/p/android/issues/detail?id=77843

回答1:

I get this error when calling setBackgroundColor() method, which is defined in View class.

cardView.setBackgroundColor(Color.parseColor("#ffffcc"));

Instead setCardBackgroundColor() method should be called, which is specific to CardViews and defined within CardView class.

This code setting both background colour and the corner radius works for me:

cardView.setCardBackgroundColor(Color.parseColor("#ffffcc"));
cardView.setRadius(50);


回答2:

I know this is a old question but, if you wanna change a bgcolor of CardView now in android.support.v7.widget.CardView you can just use setCardBackgroundColor:

 cardView.setCardBackgroundColor(Color.parseColor("#dddddd"));

or just

 cv.setCardBackgroundColor(Color.LTGRAY);


回答3:

I found that you cannot set the background of a card view. Even in XML. So this is my workaround:

Put everything in a child layout of the card:

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:elevation="10dp">
<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/holder_relative_layout"
    android:orientation="horizontal"
    android:gravity="center_vertical">
...

Then in code:

cardView.row.findViewById(R.id.holder_relative_layout).setBackgroundColor(getResources().getColor(R.color.MediumSeaGreen));


回答4:

The comment about using SetCardBAckgroundColor with CardViews is correct but I had to cast the Views to View as well to get it to compile

((CardView)holder.itemView).setCardBackgroundColor(Color.parseColor("#FFFFCC"));

All works now.



回答5:

I faced the same crash. The problem is you are setting background color to CardView programatically in your code.

card.setBackgroundColor(Color.parseColor("#"+color));

comment the line. and set the background and other property in xml itself. Don't do it programatically.

This worked for me. :)

Better you define the different xml file for different situation / data, that you want to differentiate.



回答6:

This is an easy problem of support library, if you set background drawable first and then color. They (Google) call getDrawable() to set the background color, if you call color Change. They cast Drawable to RoundRectdrawable and you possibly have another kind of Drawable. For example a ninepatch Drawable. Simply override setBackgroundColor() to setBackgroundDrawable(new RoundedDrawable(...)) Not sure about constructor and class name, just look at source code of cardview.

This is the problem:

@Override
public void setBackgroundColor(CardViewDelegate cardView, int color) {
   ((RoundRectDrawable) (cardView.getBackground())).setColor(color);
}

change to:

@Override
public void setBackgroundColor(int color) {
    setBackgroundDrawable(new RoundRectDrawable(color, getRadius()));
}