【问题标题】:How to disable call inside onChecked change conditionally?如何有条件地在 onChecked 更改中禁用调用?
【发布时间】:2023-03-14 05:04:02
【问题描述】:

我的片段中有切换(切换)按钮。进入片段后,我正在读取 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;
}

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

如何确保 onCheckChange 方法在设置值后只被调用一次?

我也尝试过的事情 1)使用 onClick 侦听器并禁用 oncheckchanged 中的调用并在单击时启用。 2) 使用 onTouch

谢谢你:)

【问题讨论】:

    标签: android toggle uiswitch


    【解决方案1】:

    这很有趣,因为在 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() 内部立即调用。

    【讨论】:

    • 感谢您的输入 :) 。我找到了我的答案,我在下面的答案中提到了。:) 实际上 view.isPressed() 是我所需要的:) 请参考我提到的链接中的答案 :) 对于一个框架略有不同的问题,这是一个相同的解决方案:)
    【解决方案2】:

    嘿,我在下面的链接中得到了我对一个框架略有不同的问题的回答。感谢这个人:)

    onCheckedChanged called automatically

    【讨论】:

    • 什么问题,链接回你的问题。
    • 编辑了答案。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多