如何在Fragment中实现点击开关/按钮控制Sensor传感器的启停
解决方案
核心错误原因
SensorManager.registerListener()的第一个参数需要传入实现了SensorEventListener接口的实例,而非Context对象:
- 你当前的
StepCounterFragment本身已经实现了SensorEventListener接口,符合参数要求 - 你之前传入的
getContext()、getApplication()都是Context类型,和参数要求不匹配,自然无法生效 - 如果直接在
OnCheckedChangeListener匿名内部类中写this,指代的是当前监听类实例,不是Fragment实例,也会报错
具体修改点
- 修正注册监听的传参,同步补充关闭开关时的解绑逻辑
- 补充Fragment生命周期销毁时的解绑操作,避免内存泄漏
- 在
onSensorChanged回调中补充计步数值更新逻辑
修改后的核心代码片段
switchMaterial.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (sensorStepCounter != null) { // 传入当前Fragment实例作为监听回调 sensorManager.registerListener(StepCounterFragment.this, sensorStepCounter, SensorManager.SENSOR_DELAY_NORMAL); } } else { // 关闭开关时解绑监听 sensorManager.unregisterListener(StepCounterFragment.this); } } }); // 补充Fragment销毁时的解绑逻辑,避免内存泄漏 @Override public void onDestroyView() { super.onDestroyView(); if (sensorManager != null) { sensorManager.unregisterListener(StepCounterFragment.this); } } // 补充计步回调逻辑 @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) { // event.values[0]是系统返回的累计步数,可根据需求做重置、展示处理 setSteps.setText(String.valueOf(event.values[0])); } }
额外注意事项
- 安卓10及以上系统需要申请
ACTIVITY_RECOGNITION动态权限,才能正常使用计步传感器,需要在代码中补充权限申请逻辑 - 计步传感器返回的是系统启动以来的累计步数,如果需要实现自定义重置功能,可以自行记录重置时的基准步数,用当前回调步数减去基准步数得到需要的展示数值
内容的提问来源于stack exchange,提问作者Borissenko
相关产品推荐
相关产品推荐

