簡體   English   中英

我為什么不能演員?

[英]Why can't I do cast?

我需要更改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)

更新 :這在API 5.0及更高版本中不起作用,如何在Ice Cream及更高版本中起作用? 無需創建星圖

由於着色可繪制對象是Android 5引入的,因此appcompat-v7庫將可繪制TintDrawable包裝在TintDrawable類中。 您可以使用反射來解決它。 使用以下要點 ,然后使用以下代碼段:

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

確保調用ratingBar.setProgressDrawable(stars)替換最初着色的可繪制對象。

編輯:要點可能與proguard不兼容(幾個保持類規則應予以修復)。

getPorgressDrawable返回Drawable對象。 LayerDrawable擴展了Drawable。

您將Drawable對象顯式轉換為LayerDrawable ,這會導致運行時錯誤,因為Drawable對象不是 LayerDrawable 只有LayerDrawable對象是Drawable

你可能想看看這個關於Java的類型轉換。

最干凈的方法是定義自己的Drawable如下所示: Android RatingBar更改星形顏色

投放錯誤是由於android支持庫造成的。 支持庫將大多數android小部件可繪制對象包裝到TintDrawableWrapper中 ,該擴展了DrawableWrapper 您只能通過使用反射來訪問字段來訪問真實的(包裝的)可繪制對象

private final Drawable mDrawable;

這應該是您要查找的LayerDrawable

但是請注意,可以隨時通過任何支持庫更新來更改字段的名稱。

另一種“ hacky”方式是使用着色方法

public void setTint(int tint);
public void setTintList(ColorStateList tint)

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

今天,以編程方式創建RatingBar時遇到了類似的問題。 以下變通辦法也對我使用AppCompatRatingBar的Android 4.x設備有效:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM