Caused by: java.lang.ClassCastEx

2019-10-23  本文已影响0人  小马要加油

问题记录:
运行的时候应用挂了,根据堆栈打出了这个错误。
找到错误对应的xml

<com.android.systemui.statusbar.phone.ExpandableIndicator
            android:id="@+id/expand_indicator"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:clipToPadding="false"
            android:clickable="true"
            android:focusable="true"
            android:background="?android:attr/selectableItemBackgroundBorderless"
            android:contentDescription="@string/accessibility_quick_settings_expand"
            android:padding="12dp" />

这边说这个background不能转换成RippleDrawable。
根因分析:
首先?android:attr/selectableItemBackgroundBorderless这个背景在哪里。
这个说明用的是默认主题包里面的,那默认主题包在哪呢?
进入这个style看

image.png
然后一步一步的往找,我找到了这个,也就是说用的是selectableItemBackground,打开item_background.xml
image.png
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_window_focused="false" android:drawable="@color/transparent" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="true"                                                             android:drawable="@drawable/list_selector_background_focused" />
    <item android:drawable="@color/transparent" />

</selector>

咦是selector节点开头的图片资源,于是我
全局搜索了下所有的一下selectableItemBackground,分别进去看资源,发现带红点的都是以selector节点开头,剩余的以ripple开头


image.png

而bug里指代码对图片资源进行了强转。
所以这边有两个方法,方法一,将类型转换正确,二修改资源读取目录,读对资源。
附上两种节点对应的类型
地址:frameworks/base/graphics/java/android/graphics/drawable/DrawableInflater.java
:

   @NonNull
    @SuppressWarnings("deprecation")
    private Drawable inflateFromTag(@NonNull String name) {
        switch (name) {
            case "selector":
                return new StateListDrawable();
            case "animated-selector":
                return new AnimatedStateListDrawable();
            case "level-list":
                return new LevelListDrawable();
            case "layer-list":
                return new LayerDrawable();
            case "transition":
                return new TransitionDrawable();
            case "ripple":
                return new RippleDrawable();
            case "color":
                return new ColorDrawable();
            case "shape":
                return new GradientDrawable();
            case "vector":
                return new VectorDrawable();
            case "animated-vector":
                return new AnimatedVectorDrawable();
            case "scale":
                return new ScaleDrawable();
            case "clip":
                return new ClipDrawable();
            case "rotate":
                return new RotateDrawable();
            case "animated-rotate":
                return new AnimatedRotateDrawable();
            case "animation-list":
                return new AnimationDrawable();
            case "inset":
                return new InsetDrawable();
            case "bitmap":
                return new BitmapDrawable();
            case "nine-patch":
                return new NinePatchDrawable();
            default:
                return null;
        }
    }
上一篇下一篇

猜你喜欢

热点阅读