如何禁用内部呼叫检查有条件地更改



我的片段中有切换(开关(按钮。进入片段后,我正在读取 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被反复调用,就好像我设置了一些值一样,它继续在无限循环中调用自己。这是我的检查更改代码。

 @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;
}

因此,由于检查if(b(,它不断切换为打开和关闭。 :)

我该怎么做才能确保在设置值后只调用一次 onCheckChange 方法?

我也尝试过的事情1( 使用 onClick 侦听器并禁用 oncheckchanged 的呼叫和单击时启用。2( 使用触控

谢谢:)

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

public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
            notifyViewAccessibilityStateChangedIfNeeded(
                    AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
            // Avoid infinite recursions if setChecked() is called from a listener
            if (mBroadcasting) {
                return;
            }
            mBroadcasting = true;
            if (mOnCheckedChangeListener != null) {
                mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
            }
            if (mOnCheckedChangeWidgetListener != null) {
                mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
            }
            mBroadcasting = false;            
        }
    }

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

嘿,

我在下面的链接中得到了一个框架略有不同的问题的答案.多亏了这家伙:)

onChecked更改自动调用

最新更新