Android 开关小部件中的事件问题

Android 开关小部件中的事件问题,android,Android,大家好 我面临以下问题,我有一个带有两个小部件的片段,一个开关和一个Seekbar。我试着在开关打开和关闭时执行一个函数,在Seekbar跟踪时执行一个方法,这两种方法都会影响两个小部件,例如,假设我们有一个可调光的灯,我们可以打开或关闭,也可以调暗灯光亮度,这就是我所说的情况 我试图在Switch小部件上使用事件setOnCheckedChanged,但问题是,当我移动seekbar以更改Dim时,我必须更改开关的检查状态,在执行此操作时,小部件再次触发了setOnCheckedChanged

大家好

我面临以下问题,我有一个带有两个小部件的片段,一个开关和一个Seekbar。我试着在开关打开和关闭时执行一个函数,在Seekbar跟踪时执行一个方法,这两种方法都会影响两个小部件,例如,假设我们有一个可调光的灯,我们可以打开或关闭,也可以调暗灯光亮度,这就是我所说的情况

我试图在Switch小部件上使用事件

setOnCheckedChanged
,但问题是,当我移动seekbar以更改Dim时,我必须更改开关的检查状态,在执行此操作时,小部件再次触发了setOnCheckedChanged事件,因此我得到了类似loop的东西

我的问题是,有没有办法将onCheckedChanged事件设置为仅在用户实际触摸屏幕中的小部件时触发

这是我正在使用的代码:

sw_dimmable.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                pb_dimmable.setVisibility(View.VISIBLE);
                String val = "0";
                if (isChecked) {
                    val = "100";
                } else {
                    val = "0";
                }
                new handleTurnOffOn(getActivity()).execute(val);
        }
    });
seekbar的代码:

seekBar_dimmable.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        String val = "0";
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            pb_dimmable.setVisibility(View.VISIBLE);
            val = String.valueOf(seekBar_dimmable.getProgress());
            new handleLevelChange(getActivity()).execute(val);
        }
    });
这些事件调用此方法:

public void LoadInputFields() {
    lb_dimmable_name.setText(deviceItemDimmable.getDeviceItemName());
    if(deviceItemDimmable.getDeviceItemDimmableStatus().equals("0") ){
        lb_dimmable_status.setText("Status: Off");
        sw_dimmable.setChecked(false);
    }else{
        lb_dimmable_status.setText("Status: On");
        sw_dimmable.setChecked(true);
    }
    String level = deviceItemDimmable.getDeviceItemDimmableLevel();
    if(level != null){
        Integer val = Integer.valueOf(level);
        seekBar_dimmable.setProgress(val);
    }else {
        seekBar_dimmable.setProgress(0);
    }
}
提前谢谢

这将根据

@once2go的答案解决问题

 public void LoadInputFields() {
    lb_dimmable_name.setText(deviceItemDimmable.getDeviceItemName());
    if(deviceItemDimmable.getDeviceItemDimmableStatus().equals("0") ){
        lb_dimmable_status.setText("Status: Off");
        sw_dimmable.setOnCheckedChangeListener(null);
        sw_dimmable.setChecked(false);
    }else{
        lb_dimmable_status.setText("Status: On");
        sw_dimmable.setOnCheckedChangeListener(null);
        sw_dimmable.setChecked(true);
    }
    String level = deviceItemDimmable.getDeviceItemDimmableLevel();
    if(level != null){
        Integer val = Integer.valueOf(level);
        seekBar_dimmable.setProgress(val);
    }else {
        seekBar_dimmable.setProgress(0);
    }
}

您可以将侦听器创建为对象,而不是方法参数,f-e:

private CompoundButton.OnCheckedChangeListener own_listener = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                pb_dimmable.setVisibility(View.VISIBLE);
                String val = "0";
                if (isChecked) {
                    val = "100";
                } else {
                    val = "0";
                }
                new handleTurnOffOn(getActivity()).execute(val);
        }
    }
然后在影响第一个侦听器的另一个小部件侦听器中,设置null listener,f-e:

seekBar_dimmable.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        String val = "0";
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
sw_dimmable.setOnCheckedChangeListener(null); // here is disable listener 
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
sw_dimmable.setOnCheckedChangeListener(own_listener); // here is enable listener 
            pb_dimmable.setVisibility(View.VISIBLE);
            val = String.valueOf(seekBar_dimmable.getProgress());
            new handleLevelChange(getActivity()).execute(val);
        }
    });

希望对您有所帮助

非常感谢您的回答,我用您的部分答案解决了问题,我只需要使用
sw_dimmable.setoncheckedchangedlistener(null)LoadInputFields()
中的code>,一切都按预期工作。感谢againI用解决方案更新我的问题,再次感谢您的时间事实上,如果有帮助,您可以投票给我的答案)在我看来这是这项服务声誉的原因)祝您好运