material-components-android icon indicating copy to clipboard operation
material-components-android copied to clipboard

[MaterialSwitch] Crash occurs when calling setThumbTintMode on a switch with a thumb icon

Open fsgjlp opened this issue 1 year ago • 3 comments
trafficstars

Crash:

java.lang.RuntimeException: Unable to start activity ComponentInfo{***}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
	at android.app.ActivityThread.access$800(ActivityThread.java:144)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loop(Looper.java:135)
	at android.app.ActivityThread.main(ActivityThread.java:5221)
	at java.lang.reflect.Method.invoke(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:372)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
	at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:968)
	at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1014)
	at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:135)
	at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:932)
	at androidx.core.graphics.drawable.WrappedDrawableApi14.mutate(WrappedDrawableApi14.java:233)
	at androidx.appcompat.widget.SwitchCompat.applyThumbTint(SwitchCompat.java:754)
	at androidx.appcompat.widget.SwitchCompat.setThumbTintMode(SwitchCompat.java:736)
	at com.google.android.material.materialswitch.MaterialSwitch.setThumbTintMode(MaterialSwitch.java:170)
	***
	at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3104)
	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:524)
	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
	at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
	at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1808)
	at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751)
	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2976)
	at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2886)
	at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
	at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:351)
	at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
	at android.app.Activity.performStart(Activity.java:5953)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
	at android.app.ActivityThread.access$800(ActivityThread.java:144) 
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
	at android.os.Handler.dispatchMessage(Handler.java:102) 
	at android.os.Looper.loop(Looper.java:135) 
	at android.app.ActivityThread.main(ActivityThread.java:5221) 
	at java.lang.reflect.Method.invoke(Native Method) 
	at java.lang.reflect.Method.invoke(Method.java:372) 
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Source code:

   <com.google.android.material.materialswitch.MaterialSwitch
     android:id="@+id/adaptive_mode_switch"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     app:thumbIcon="@drawable/ic_switch_default" />
        binding.adaptiveModeSwitch.apply {
            thumbTintList = ColorStateList.valueOf(Color.RED)
            thumbTintMode = PorterDuff.Mode.MULTIPLY
        }

Android API version: 21

Material Library version: 1.11.0

Device: Samsung Galaxy J1

fsgjlp avatar Mar 30 '24 18:03 fsgjlp

@drchen would you be able to take a look at this issue?

hunterstich avatar Apr 01 '24 13:04 hunterstich

@hunterstich can you help review the linked PR? I think the PR fixes the issue.

drchen avatar Apr 01 '24 15:04 drchen

Is there any news on a fix for the issue?

fsgjlp avatar Apr 15 '24 22:04 fsgjlp

Apologies for the delay, this issue has been fixed via the PR linked!

leticiarossi avatar May 07 '24 20:05 leticiarossi