2015-04-19 59 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); 
}