美文网首页
Caused by: java.lang.ClassCastEx

Caused by: java.lang.ClassCastEx

作者: 小马要加油 | 来源:发表于2019-10-23 19:26 被阅读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;
            }
        }
    

    相关文章

      网友评论

          本文标题:Caused by: java.lang.ClassCastEx

          本文链接:https://www.haomeiwen.com/subject/hrbhvctx.html