我已在片段内切换(切换)按钮。在片段上播放后,我正在读取BLE值并设置切换按钮。
@Override
public void sosStatus(boolean sosvalue, BluetoothGattCharacteristic sosCharac) {
if (sosvalue) {
byte[] charValue = sosCharac.getValue();
String valueOfCharInstring = StringUtils.byteToHex(charValue[0]);
Log.d("+++++SosStatus",""+sosCharac.getUuid().toString() + " " + valueOfCharInstring);
if (sosCharac.getUuid().toString().equalsIgnoreCase(BLEConstants._BUTTON_CHARACTERISTIC)) {
if (valueOfCharInstring.equalsIgnoreCase(BLEConstants.EnableCharacInString)) {
setButtonStatus(touchButton,R.id.switch_btn_device_touch,"Enabled");
// touchButton.setChecked(true);
// tvTouchButtonAction.setText("Enabled");
} else if (valueOfCharInstring.equalsIgnoreCase(BLEConstants.DisableCharacInString)) {
setButtonStatus(touchButton,R.id.switch_btn_device_touch,"Disabled");
// touchButton.setChecked(false);
// tvTouchButtonAction.setText("Disabled");
}
}
if (characList.size() > 0) {
gattclientCallBack.readCharacteristicMain(UUID.fromString(characList.remove(characList.size() - 1)));
} else {
useOnCheckedChangeMethod = true;
showProgress(false);
}
} else {
useOnCheckedChangeMethod = true;
showProgress(false);
HandleCharacListData(true,false,"");
}
}
现在使用Switch小部件后,发生的事情是,当我第一次以编程方式读取值时,它工作正常。但是当我用触摸切换按钮时,onCheckChanged被反复调用,好像我设置了一些值,它继续在无限循环中调用自己。这是我的oncheckchanged代码。
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
try {
if (useOnCheckedChangeMethod) {
switch (compoundButton.getId()) {
case R.id.switch_btn_device_touch:
touchButton.setOnCheckedChangeListener(null);
//showProgress(true);
HandleCharacListData(true,false,"");
HandleCharacListData(false,false,BLEConstants.TOUCH_BUTTON_CHARACTERISTIC);
if(characList!=null && characList.size()>0) {
if(b) {
gattclientCallBack.writeCharacteristic(characList.remove(characList.size() - 1), BLEConstants.DisableCharac);
}
else {
gattclientCallBack.writeCharacteristic(characList.remove(characList.size() - 1), BLEConstants.EnableCharac);
}
}
Log.d("Touch++++", "+++");
break;
}
因此,由于检查是否(b),它继续继续切换为开关。 :)
我该怎么做才能确保在设置值后只调用一次onCheckChange方法?
我也尝试过的事情 1)使用onClick侦听器并在oncheckchanged中禁用调用并单击启用。 2)使用onTouch
谢谢:)
答案 0 :(得分:0)
有趣的是,因为在setChecked()内部,它实际上会检查它是否在广播中间并返回......
computed property names
我所知道的唯一解决方案是在调用setChecked()之前取消注册回调,并在调用返回后再次注册回调。这是有效的,因为回调不是异步调用,而是在setChecked()内立即调用。
答案 1 :(得分:0)
嘿,我在下面的链接中得到了我的答案。感谢这个家伙:)