私はサードパーティのライブラリを使用していますが、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;
}
DrawableCompatのソースコードを見ると、どのバージョン<support library 21
メソッドは何もしません 。
DrawableCompatのアイデアは、実際にその機能を提供するのではなく、単に古いバージョンでクラッシュしないように思われます。
support library 22.1
DrawableCompatを使用して、ドロウアブルに色を付けることができます。
DrawableCompat.wrap(Drawable)およびsetTint()、setTintList()、およびsetTintMode()は機能します。複数の色をサポートするためだけに個別のドロウアブルを作成および維持する必要はありません!
私はプロジェクトでボタンの背景とそのエラーを作成するために?colorPrimaryを使用し、?colorPrimaryを@ color/colorPrimaryに変更し、その仕事を私のために:)