2015-04-19 98 views
1

我需要更改星星ratingBar的顏色,但會得到一個異常,它爲什麼會發生並且完全被接受?爲什麼我不能施放?

ResultActivity

private void setDados() { 
     TextView text = (TextView) findViewById(R.id.textView3); 
     text.setText((text.getText()) + "" + corretas); 
     RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar); 
     ratingBar.setRating((100*corretas)/(corretas+erradas)); 
     LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable(); 
     try { 
      stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

登錄

04-18 22:02:39.828 31732-31732/com.morais.daniela.doctorquiz E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.morais.daniela.doctorquiz/com.morais.daniela.doctorquiz.Activity.ResultActivity}: java.lang.ClassCastException: android.support.v7.internal.widget.TintDrawableWrapper cannot be cast to android.graphics.drawable.LayerDrawable 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 
      at android.app.ActivityThread.access$600(ActivityThread.java:127) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4448) 
      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:823) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.ClassCastException: android.support.v7.internal.widget.TintDrawableWrapper cannot be cast to android.graphics.drawable.LayerDrawable 
      at com.morais.daniela.doctorquiz.Activity.ResultActivity.setDados(ResultActivity.java:44) 
      at com.morais.daniela.doctorquiz.Activity.ResultActivity.onCreate(ResultActivity.java:36) 
      at android.app.Activity.performCreate(Activity.java:4465) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 
            at android.app.ActivityThread.access$600(ActivityThread.java:127) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4448) 
            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:823) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
            at dalvik.system.NativeStart.main(Native Method) 

UPDATE:這不會在API 5.0和更高的工作,我如何在冰淇淋和更高的作品嗎?無需創建星形圖像

+0

發佈「ResultActivity」的所有代碼。加上你的錯誤似乎是:'android.support.v7.internal.widget.TintDrawableWrapper不能轉換爲android.graphics.drawable.LayerDrawable'。 –

+0

類似的問題和答案:http://stackoverflow.com/a/17267921/950427。 –

+0

第44行是'LayerDrawable stars =(LayerDrawable)ratingBar.getProgressDrawable();'。根據另一個問題中的評論不適用於API 5.0和起來http://stackoverflow.com/questions/2446270/android-ratingbar-change-star-colors –

回答

1

因爲在Android 5中引入了可着色drawables,所以appcompat-v7庫在TintDrawable類中包裝drawables。你可以用反射來解決它。使用this gist然後這個片段:

LayerDrawable stars = (LayerDrawable) XpeceDrawableWrapper.getDrawable(ratingBar.getProgressDrawable()); 

一定要打電話ratingBar.setProgressDrawable(stars)以取代原先有色繪製。

編輯:它的實質可能與proguard不兼容(一些保守類規則應該修補它)。

0

getPorgressDrawable返回一個Drawable對象。 LayerDrawable延伸Drawable。

你被明確鑄造Drawable對象LayerDrawable,其中得出結論運行時錯誤,因爲Drawable對象不是一個LayerDrawable。只有LayerDrawable對象是Drawable

您可能想看看this關於Java中的類型轉換。

0

最乾淨的方法是定義你自己的Drawable喜歡這裏建議:Android RatingBar change star colors

鑄造錯誤是由於Android的支持庫。支持庫將大部分Android小部件可繪製包裝到TintDrawableWrapper中,其擴展爲DrawableWrapper。您只能通過使用反射來訪問現場

private final Drawable mDrawable; 

這應該是LayerDrawable你正在尋找訪問真正的(包裹)繪製。

但請注意,可隨時更新任何支持庫更新字段的名稱。

另一個「哈克」的方式是使用着色的方法

public void setTint(int tint); 
public void setTintList(ColorStateList tint) 
其在 DrawableWrapper定義

。由於DrawableWrapper具有包可見性,因此您必須編寫一個輔助類並將其放入android.support.v7.internal.widget包中以訪問這些方法

0

以編程方式創建RatingBar時,今天出現了類似問題。以下解決方法對我來說也適用於Android4.。x使用AppCompatRatingBar的設備:

AppCompatRatingBar rb = new AppCompatRatingBar(activity); 
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
layoutParams.gravity = Gravity.CENTER; 
rb.setLayoutParams(layoutParams); 
rb.setStepSize(1.0f); 
rb.setMax(5); 

LayerDrawable layerDrawable = null; 
if (rb.getProgressDrawable() instanceof LayerDrawable) { 
    layerDrawable = (LayerDrawable) rb.getProgressDrawable(); 
} else if (rb.getProgressDrawable() instanceof DrawableWrapper) { 
    DrawableWrapper wrapper = (DrawableWrapper) rb.getProgressDrawable(); 
    if (wrapper.getWrappedDrawable() instanceof LayerDrawable) { 
     layerDrawable = (LayerDrawable) wrapper.getWrappedDrawable(); 
    } 
} 

if (layerDrawable != null) { 
    layerDrawable.getDrawable(2).setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); 
    layerDrawable.getDrawable(0).setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); 
    layerDrawable.getDrawable(1).setColorFilter(ContextCompat.getColor(activity, R.color.primary), PorterDuff.Mode.SRC_ATOP); 
}