Не удалось найти класс 'android.graphics.drawable.RippleDrawable'
Я использую стороннюю библиотеку, есть метод, использующий DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
, Когда я тестировал свое приложение в Android 5.0+, проблем не было, и он работал хорошо. Но когда дело дошло до Android 4.4.4, он выдал исключение:
05-09 13:15:15.030 26447-26447/com.wizchen.athit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wizchen.athit, PID: 26447
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wizchen.athit/com.wizchen.athit.view.activity.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2271)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2320)
at android.app.ActivityThread.access$800(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5117)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.support.v4.graphics.drawable.DrawableWrapperDonut.setCompatTintMode(DrawableWrapperDonut.java:278)
at android.support.v4.graphics.drawable.DrawableCompatBase.setTintMode(DrawableCompatBase.java:48)
at android.support.v4.graphics.drawable.DrawableCompat$BaseDrawableImpl.setTintMode(DrawableCompat.java:99)
at android.support.v4.graphics.drawable.DrawableCompat.setTintMode(DrawableCompat.java:400)
at com.wizchen.athit.lib.AppThemeEngine.util.TintHelper.createTintedDrawable(TintHelper.java:359)
at com.wizchen.athit.lib.AppThemeEngine.viewprocessors.ToolbarProcessor.process(ToolbarProcessor.java:117)
at com.wizchen.athit.lib.AppThemeEngine.viewprocessors.ToolbarProcessor.process(ToolbarProcessor.java:44)
at com.wizchen.athit.lib.AppThemeEngine.ATE.postApply(ATE.java:209)
at com.wizchen.athit.lib.AppThemeEngine.ATEActivity.onStart(ATEActivity.java:60)
at com.wizchen.athit.view.activity.MainActivity.onStart(MainActivity.java:68)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1183)
at android.app.Activity.performStart(Activity.java:5359)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2244)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2320)
at android.app.ActivityThread.access$800(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5117)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
За исключением трассировки стека выше, я увидел некоторую информацию об ошибке, напечатанную в моей консоли следующим образом:
05-09 13:15:15.030 26447-26447/com.wizchen.athit E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method com.wizchen.athit.lib.AppThemeEngine.util.TintHelper.setTintAuto
И этот:
05-09 13:15:15.030 26447-26447/com.wizchen.athit E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method com.wizchen.athit.lib.AppThemeEngine.util.TintHelper.setTintSelector
Конечно, я собрал библиотеку поддержки v4 в моем проекте:)
Кто сталкивался с этой проблемой? Спасибо за помощь!
-------------------------------------------------- ----------------------------------------
Обновление 1: это то, что вызывает исключение NullPointerException:
@CheckResult
@Nullable
public static Drawable createTintedDrawable(@Nullable Drawable drawable, @ColorInt int color) {
if (drawable == null) return null;
drawable = DrawableCompat.wrap(drawable.mutate());
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
DrawableCompat.setTint(drawable, color);
return drawable;
}
2 ответа
Прочитай это:
Если вы посмотрите на исходный код DrawableCompat, вы увидите это для любой версии < support library 21
метод ничего не делает
Идея DrawableCompat, кажется, просто не дает сбой на старых версиях, вместо того, чтобы фактически обеспечить эту функциональность.
Полезные советы:
С support library 22.1
Вы можете использовать DrawableCompat для подкрашивания рисованных объектов.
DrawableCompat.wrap (Drawable) и setTint(), setTintList() и setTintMode() будут просто работать: не нужно создавать и поддерживать отдельные рисунки только для поддержки нескольких цветов!
Я использовал?colorPrimary для создания фона кнопки и ее ошибки ради в моем проекте, и я меняю?colorPrimary на @color/colorPrimary и его работа для меня:)