如何有条件地禁用onChecked中的调用?

时间:2018-01-03 19:20:49

标签: android toggle uiswitch

我已在片段内切换(切换)按钮。在片段上播放后,我正在读取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

谢谢:)

2 个答案:

答案 0 :(得分:0)

有趣的是,因为在setChecked()内部,它实际上会检查它是否在广播中间并返回......

computed property names

我所知道的唯一解决方案是在调用setChecked()之前取消注册回调,并在调用返回后再次注册回调。这是有效的,因为回调不是异步调用,而是在setChecked()内立即调用。

答案 1 :(得分:0)

嘿,我在下面的链接中得到了我的答案。感谢这个家伙:)

onCheckedChanged called automatically