web-dev-qa-db-fra.com

android.graphics.drawable.ColorDrawable ne peut pas être converti en Android.support.v7.widget.RoundRectDrawableWithShadow

J'ai essayé d'utiliser CardView dans mon application qui fonctionnait assez bien dans ma mise en page XML. Comme je veux les générer dans mon code et non via xml, j'ai essayé de définir le rayon avec CardView.setRadius () - Méthode suggérée par Android Developers ( https: // developer.Android.com/preview/material/ui-widgets.html#cardview ).

Cela ne fonctionne pas du tout! J'espère que quelqu'un peut m'aider, avec mon problème ou a obtenu une solution de contournement agréable avec des dispositions xml.

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

Voici mon journal:

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)

MISE À JOUR: J'utilise le nouveau SDK Lollipop maintenant avec Appcompat version 21. Maintenant, il ne fonctionne même pas du tout, quand je l'essaye sans setRadius ().

Nouveau journal:

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)

Mise à jour 2: Je suppose que c'est un bug de google. Je leur ai donc fait remarquer: https://code.google.com/p/Android/issues/detail?id=7784

49
D4ddy-LiLd4rk

J'obtiens cette erreur lors de l'appel de la méthode setBackgroundColor (), qui est définie dans la classe View.

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

Au lieu de cela, la méthode Card BackgroundColor () doit être appelée, qui est spécifique à CardViews et définie dans la classe CardView.

Ce code définissant à la fois la couleur d'arrière-plan et le rayon d'angle fonctionne pour moi:

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

Je sais que c'est une vieille question mais, si vous voulez changer un bgcolor de CardView maintenant dans Android.support.v7.widget.CardView, vous pouvez simplement utiliser setCardBackgroundColor:

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

ou juste

 cv.setCardBackgroundColor(Color.LTGRAY);
6
rcorbellini

J'ai constaté que vous ne pouvez pas définir l'arrière-plan d'une vue de carte. Même en XML. Voici donc ma solution:

Mettez tout dans une disposition enfant de la carte:

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

Puis en code:

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

Le commentaire sur l'utilisation de SetCardBAckgroundColor avec CardViews est correct, mais j'ai également dû convertir les vues en View pour le compiler.

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

Tout fonctionne maintenant.

1
formica

Il s'agit d'un problème facile de bibliothèque de support, si vous définissez d'abord l'arrière-plan à dessiner, puis la couleur. Ils (Google) appellent getDrawable () pour définir la couleur d'arrière-plan, si vous appelez changement de couleur. Ils jettent Drawable à RoundRectdrawable et vous avez peut-être un autre type de Drawable. Par exemple, un neufpatch Drawable. Remplacez simplement setBackgroundColor () par setBackgroundDrawable (nouveau RoundedDrawable (...)) Vous n'êtes pas sûr du constructeur et du nom de classe, regardez simplement le code source de cardview.

C'est le problème:

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

changer en:

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

J'ai fait face au même crash. Le problème est que vous définissez la couleur d'arrière-plan sur CardView par programme dans votre code.

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

commentez la ligne. et définissez l'arrière-plan et d'autres propriétés dans xml lui-même. Ne le faites pas par programme.

Cela a fonctionné pour moi. :)

Mieux vaut définir les différents fichiers xml pour différentes situations/données que vous souhaitez différencier.

0
vikoo