如何定位Android开发中ToggleButton切换状态导致应用崩溃的问题
问题修复方案
可能的故障原因
- 自定义
toggle_selector背景资源异常:切换按钮状态时加载资源失败/加载超大资源阻塞主线程,触发ANR - Toast自定义逻辑存在系统兼容性问题:高版本Android对自定义Toast有限制,
getView()在部分ROM上可能触发隐藏的主线程阻塞 - Context使用不规范:使用
getBaseContext()加载Toast存在兼容性隐患 - 存在其他未展示的耗时逻辑绑定了按钮状态切换回调
修复步骤
- 排查背景资源问题
先临时替换ToggleButton的背景为系统内置资源测试:
<ToggleButton android:id="@+id/toggle_button" android:layout_width="35dp" android:layout_height="35dp" android:layout_marginTop="-2dp" android:layout_marginLeft="-45dp" android:background="@android:color/holo_blue_dark" android:textOff="" android:textOn="" />
如果切换状态不再崩溃,说明你自定义的toggle_selector存在资源引用错误、或使用的图片尺寸过大,检查selector配置并压缩背景图即可。
- 优化Java逻辑
移除自定义Toast的兼容风险代码,直接使用当前Activity作为Context加载Toast:
/*------------------------------屏幕常亮控制开关----------------------------------------------------*/ ToggleButton toggle_button = findViewById(R.id.toggle_button); toggle_button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Toast.makeText(YourCurrentActivity.this, "屏幕常亮已开启,设备不会自动休眠", Toast.LENGTH_LONG).show(); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Toast.makeText(YourCurrentActivity.this, "屏幕常亮已关闭,将跟随系统休眠设置", Toast.LENGTH_LONG).show(); } } }); /*------------------------------屏幕常亮控制开关----------------------------------------------------*/
注意将YourCurrentActivity替换为你当前Activity的类名。
排查ANR日志
打开Android Studio的Logcat面板,过滤关键字ANR和你的应用包名,可直接定位到阻塞主线程的具体代码位置。检查监听重复绑定问题
确认你仅在onCreate中给ToggleButton设置了一次监听,不要在onResume等重复回调的生命周期方法中重复设置监听,避免多次触发回调导致卡顿。
内容的提问来源于stack exchange,提问作者Sam Joshua
相关产品推荐
相关产品推荐

