2014-10-16 7 views
49

Ich habe versucht, CardView in meiner Anwendung zu verwenden, die ziemlich gut in meinem XML-Layout funktioniert. Da ich sie in meinem Code und nicht über XML generieren möchte, habe ich versucht, den Radius mit CardView.setRadius() - Methode wie von Android Developers vorgeschlagen (https://developer.android.com/preview/material/ui-widgets.html#cardview) zu setzen.android.graphics.drawable.ColorDrawable kann nicht in android.support.v7.widget.RoundRectDrawableWithShadow umgewandelt werden

Dies funktioniert überhaupt nicht! Ich hoffe, jemand kann mir helfen, mit meinem Problem oder habe eine schöne Workaround mit XML-Layouts.

Dies ist mein Code:

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:

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

Das ist mein Log ist ich mit AppCompat Version verwenden, um die neue Lollipop SDK jetzt 21. Jetzt funktioniert es nicht überhaupt überhaupt, wenn ich es ohne setRadius() versuche.

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: Ich denke, dies einen Fehler von Google ist. Also habe ich darauf hingewiesen: https://code.google.com/p/android/issues/detail?id=77843

+0

Check [diese] [1] [1]: http://stackoverflow.com/ a/18055679/3322203 Ich hoffe, das wird dir helfen. –

+0

Hast du das repariert? Ich habe gerade aktualisiert es stürzt – Maragues

+3

Ich habe immer noch dieses Problem. Ich nehme an, es ist ein Google-bezogener Fehler und daher habe ich einen geöffnet: https://code.google.com/p/android/issues/detail?id=77843 –

Antwort

100

ich diese Fehlermeldung erhalten, wenn setBackgroundColor Aufruf() -Methode, die in View-Klasse definiert ist.

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

gesetzt Statt Karte Background() Methode aufgerufen werden soll, die an CardViews spezifisch ist und innerhalb CardView Klasse definiert.

Dieser Code sowohl Hintergrundfarbe und den Eckenradius funktioniert für mich setzen:

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

Ich habe das selbst herausgefunden, aber ich habe meine eigene Frage vergessen. Also markiere ich deine Antwort als die richtige Antwort, weil sie das Problem behebt;) Danke für den Kopf! –

+1

dieser löste mein Problem auch. Ich habe Materialist verwendet, die auf android.support.v7.widget.CardView abhängt. App stürzt bei ab cardView.setBackgroundColor (card.getBackgroundColor()); Ich benutzte setCardBackgroundColor, die das Absturzproblem gelöst – Stevens

+1

PROBLEM. Die obige Lösung löste die Ausnahme, aber wenn ich cardView.setCardBackgroundColor (Color.TRANSPARENT) verwendete, zeichnete sich ein graues Rechteck um das Element, während setBackgroundColor (Color.TRANSPARENT) dies nicht tat. Ich möchte diesen Recatawinkel nicht. Ich möchte, dass es TRANSPARENT bleibt. Wenn man wandert, warum ich einen transparenten Hintergrund zeichne, ist es ein vorher ausgewähltes Element zu löschen. – Zvi

0

Ich sah den gleichen Absturz. Das Problem ist, dass Sie CardView programmatisch Hintergrundfarbe in Ihrem Code festlegen.

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

kommentieren Sie die Zeile. und legen Sie den Hintergrund und andere Eigenschaften in XML selbst fest. Mach es nicht programmatisch.

Das funktionierte für mich. :)

Besser Sie definieren die andere XML-Datei für verschiedene Situation/Daten, die Sie unterscheiden möchten.

4

Ich habe festgestellt, dass Sie den Hintergrund einer Kartenansicht nicht festlegen können. Sogar in XML. Also das ist meine Abhilfe:

Setzen Sie alles in einem Kind das Layout der Karte:

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

dann in Code:

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

Ich weiß, das ist eine alte Frage, aber, wenn Sie eine bgcolor von CardView in android.support.v7 jetzt wollen ändern. Widget.

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

oder nur

cv.setCardBackgroundColor(Color.LTGRAY); 
+1

Dies sollte als Antwort akzeptiert werden – portfoliobuilder

1

Der Kommentar über die Verwendung von SetCardBAckgroundColor mit CardViews korrekt ist, aber ich die Ansichten zu View und werfen musste, um es zu kompilieren zu bekommen: CardView Sie können einfach setCardBackgroundColor verwenden

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

Alles funktioniert jetzt.

0

Dies ist ein einfaches Problem der Support-Bibliothek, wenn Sie zuerst den Hintergrund und dann die Farbe festlegen. Sie (getDrawable() rufen Sie getDrawable(), um die Hintergrundfarbe festzulegen, wenn Sie Farbe ändern. Sie werfen Drawable auf RoundRectdrawable und Sie haben möglicherweise eine andere Art von Drawable. Zum Beispiel ein ninePatch Drawable. Einfach überschreiben SetBackgroundColor() zu SetBackgroundDrawable (neue RoundedDrawable (...)) Nicht sicher über Konstruktor und Klassenname, nur Quellcode von Cardview betrachten.

Das ist das Problem:

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

Änderung:

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