2015-06-20 11 views
19

Il problema che sto riscontrando è fondamentalmente quello che si trova in questo answer ma verrà spiegato in seguito. Sto testando su un dispositivo con Android 5.0.1 e un altro con 4.2.2. Sul mio dispositivo con 5.0.1 non ottengo errori e tutto si comporta come previsto. Sul mio dispositivo 4.2.2 ottengo il seguente errore:Non è possibile eseguire il cast di ColorDrawable su android.support.v7.widget.RoundRectDrawableWithShadow

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:159) 
     at android.support.v7.widget.CardViewEclairMr1.getMinWidth(CardViewEclairMr1.java:150) 
     at android.support.v7.widget.CardView.onMeasure(CardView.java:181) 
     at android.view.View.measure(View.java:15696) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:681) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
     at android.view.View.measure(View.java:15696) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:15696) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851) 
     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:15696) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2261) 
     at android.view.View.measure(View.java:15696) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2225) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1290) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1527) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1190) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4860) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:766) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:575) 
     at android.view.Choreographer.doFrame(Choreographer.java:542) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:751) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:158) 
     at android.app.ActivityThread.main(ActivityThread.java:5751) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850) 
     at dalvik.system.NativeStart.main(Native Method) 

con l'errore che si verificano in questa linea: card1.setBackgroundColor(getResources().getColor(R.color.White));

Ora, come suggerito dalla risposta legata Ho provato con setCardBackgroundColor tuttavia questo causa l'errore essere prodotto su entrambi i miei dispositivi. Eventuali suggerimenti?

Il CardView Sto tentando di utilizzare è un android.support.v7.widget.CardView

Questo è il layout che produce l'errore:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/MainLayout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#bbbbb5" 
android:orientation="vertical" 
android:weightSum="100"> 


<ImageView 
    android:id="@+id/imageView" 
    android:layout_width="fill_parent" 
    android:layout_height="400dp" 
    android:layout_gravity="center_vertical|top" 
    android:layout_marginBottom="50dp" 
    android:layout_marginTop="-65dp" 
    android:layout_toRightOf="@+id/prem_BACK" 
    android:layout_weight="0" 
    android:clickable="true" 
    android:paddingBottom="0dp" 
    android:src="@drawable/plane1" /> 


<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/imageView" 
    android:layout_alignEnd="@+id/imageView" 
    android:layout_alignRight="@+id/imageView" 
    android:layout_marginBottom="40dp" 
    android:layout_marginRight="5dp" 
    android:src="@drawable/ic_navigate_next_white_48dp" /> 

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view1" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:layout_gravity="center" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:layout_marginTop="280dp" 
    android:clickable="true" 
    android:onClick="card1ClickMethod" 
    card_view:cardCornerRadius="4dp"> 

    <TextView 
     android:id="@+id/choice_text1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:onClick="card1ClickMethod" 
     android:text="Loret ipsum sample" 
     android:textColor="#212121" /> 
</android.support.v7.widget.CardView> 

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view2" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:layout_gravity="center" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:layout_marginTop="340dp" 
    android:clickable="true" 
    android:onClick="card2ClickMethod" 
    card_view:cardCornerRadius="4dp"> 

    <TextView 
     android:id="@+id/choice_text2" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
     android:gravity="center" 
     android:onClick="card2ClickMethod" 
     android:textColor="#212121" /> 
</android.support.v7.widget.CardView> 

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view3" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:layout_gravity="center" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:layout_marginTop="400dp" 
    android:clickable="true" 
    android:onClick="card3ClickMethod" 
    card_view:cardCornerRadius="4dp"> 

    <TextView 
     android:id="@+id/choice_text3" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
     android:gravity="center" 
     android:onClick="card3ClickMethod" 
     android:textColor="#212121" /> 
</android.support.v7.widget.CardView> 

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view4" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:layout_gravity="center" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:layout_marginTop="460dp" 
    android:clickable="true" 
    android:onClick="card4ClickMethod" 
    card_view:cardCornerRadius="4dp"> 

    <TextView 
     android:id="@+id/choice_text4" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
     android:gravity="center" 
     android:onClick="card4ClickMethod" 
     android:textColor="#212121" /> 
</android.support.v7.widget.CardView> 


<TextView 
    android:id="@+id/resulttext3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/progressBar1" 
    android:layout_alignParentStart="true" 
    android:layout_gravity="center_vertical|left" 
    android:layout_marginBottom="5dp" 
    android:layout_marginLeft="5dp" 
    android:textSize="15dp" /> 

<ProgressBar 
    android:id="@+id/progressBar1" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignTop="@+id/fab" 
    android:layout_gravity="right|center_vertical" 
    android:layout_marginTop="20dp" /> 

<ImageView 
    android:id="@+id/prem_BACK" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_marginLeft="0dp" 
    android:layout_marginTop="0dp" 
    android:src="@drawable/background4" 
    android:visibility="gone" /> 

Dopo la lettura attraverso la issue described here ho notato che da allora è stato chiuso . Per quanto ne so, sto usando la versione più aggiornata degli strumenti di piattaforma e degli strumenti sdk e ho ancora questo problema.

Dopo alcuni test, ho scoperto che l'emulatore che sto usando non ha GooglePlayServices. Al momento non ho accesso a un dispositivo fisico con meno di Android 6.0 da testare. È possibile che non avere GooglePlayServices possa causare questo problema?

+0

puoi pubblicare l'errore che si ottiene quando si utilizza setCardBackgroundColor – nandeesh

+0

Stesso errore già pubblicato – ez4nick

+0

puoi postare l'xml che ha cardview? – nandeesh

risposta

1

È possibile utilizzare:

card1.setBackgroundColor(Color.rgb(255, 255, 255)); 

invece di:

card1.setBackgroundColor(getResources().getColor(R.color.White)); 
+0

Questo produce lo stesso errore di prima sul mio dispositivo 4.2.2 ma non sul mio dispositivo 5.0.1. Ci scusiamo per l'errore di battitura. – ez4nick

+0

Mhmm, l'ho provato sul mio dispositivo 5.1.1, funziona! –

+0

Ci scusiamo per l'errore di battitura. Significava il contrario. Funziona su 5.0.1 non su 4.2.2 – ez4nick

2

Questo sta lavorando per me per CardView all'interno recycleview

((CardView)viewholder.itemView).setCardBackgroundColor(Color.WHITE); 
1

Il modo più semplice per fare quello che vuoi è usando il filtro colorato, immagino. Ho provato questo su 4.2.2 e funziona bene.

cardView.getBackground().setColorFilter(Color.BLUE, PorterDuff.Mode.MULTIPLY); 
1

Utilizzando setBackgroundColor(int color) in realtà si sta chiamando un metodo su View, il passaggio sullo sfondo. Lo CardView si aspetta uno RoundRectDrawableWithShadow, che hai appena sovrascritto. Da qui l'eccezione.

CardView view = (CardView) findViewById(R.id.card); 
view.setCardBackgroundColor(Color.RED); 

Assicurati di chiamare cardView.setCardBackgroundColor(int) e funziona. Funziona su 4.2.2, e guardando attraverso il codice sorgente di cardView sono fiducioso anche su altri apis. Se anche questo porta a un crash, deve essere una ragione diversa.

+0

Hai provato questo su un dispositivo fisico o su un emulatore? Ho provato solo su un emulatore e * non * su un dispositivo fisico perché non ne ho accesso. Sul mio emulatore questo non risolve il problema. – ez4nick

+0

@ ez4nick testato su un Samsung Galaxy S2 con Api 19 ... e trovo piuttosto strano che questo non funzioni in un emulatore, soprattutto perché non c'è 'ColorDrawable' che potrebbe causare lo schianto usando quel metodo. Sei sicuro di non impostare il colore su più postazioni? –

1

Probabilmente questo è stato risolto utilizzando PublicRoundRectDrawableWithShadow.
Crea PublicRoundRectDrawableWithShadow.

package android.support.v7.widget; 

import android.content.res.Resources; 

public class PublicRoundRectDrawableWithShadow extends RoundRectDrawableWithShadow { 
    public PublicRoundRectDrawableWithShadow(Resources resources, CardView cardView, int backgroundColor) { 
     super(resources, backgroundColor, cardView.getRadius(), cardView.getCardElevation(), cardView.getMaxCardElevation()); 
    } 
} 

E setBackground() come questo.

final CardView cardView = (CardView) findViewById(R.id.card_view); 
    if (Build.VERSION_CODES.LOLLIPOP <= Build.VERSION.SDK_INT) { 
     cardView.setBackgroundColor(Color.RED); 
    } else { 
     cardView.setBackgroundDrawable(new PublicRoundRectDrawableWithShadow(getResources(), cardView, Color.RED)); 
    } 
2

Si potrebbe anche mantenere entrambe le versioni di Android felice dando loro quello che vogliono piuttosto che cercare di forzare e gettato qualcosa:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) { 
     // below lillipop 
     view.setCardBackgroundColor(Color.WHITE); 
     // working for lower questions as per another answer posted here 
    } else { 
     // lollipop and above 
     card1.setBackgroundColor(getResources().getColor(R.color.White)); 
     // known to be working for lillipop as per your question 
} 

Fondamentalmente chiamata diversi e metodi di lavoro per ciascuno di le versioni Android.

di identificare correttamente le versioni di Android sopra e sotto l'uso lecca-lecca LILLIPOP_MR1 (Soruce)

0

Si prega di provare sotto la linea specifica per impostare background color di card view object:

cardView.setCardBackgroundColor(Color.WHITE); 
Problemi correlati