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看

然后一步一步的往找,我找到了这个,也就是说用的是selectableItemBackground,打开item_background.xml

<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开头

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