J'utilise une bibliothèque tierce, il existe une méthode utilisant DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
. Lorsque je teste mon application dans Android 5.0 +, il n'y a pas eu de problème et a bien fonctionné. Mais en ce qui concerne Android 4.4.4, cela a généré une exception) :
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)
À l'exception de la trace de pile ci-dessus, j'ai vu des informations d'erreur imprimées dans ma console comme ceci:
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
Et celui-là:
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
Bien sûr, j'ai compilé la bibliothèque de support v4 dans mon projet :)
Qui a rencontré ce problème? Merci pour l'aide!
---------------------------------------------- --------------------------------------------
mise à jour 1: c'est ce qui cause 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;
}
Si vous regardez le code source de DrawableCompat, vous verrez que pour toute version <support library 21
la méthode ne fait rien .
L'idée de DrawableCompat semble simplement ne pas planter sur les anciennes versions, plutôt que de fournir réellement cette fonctionnalité.
Avec support library 22.1
vous pouvez utiliser DrawableCompat pour teinter les tirages.
DrawableCompat.wrap (Drawable) et setTint (), setTintList () et setTintMode () fonctionneront juste: pas besoin de créer et de maintenir des drawables séparés uniquement pour prendre en charge plusieurs couleurs!
j'ai utilisé? colorPrimary pour créer l'arrière-plan du bouton et son erreur de saké dans mon projet, et je change? colorPrimary en @ color/colorPrimary et son travail pour moi :)