切换小部件中的事件问题

时间:2015-11-09 16:05:15

标签: android

各位大家好

我面临以下问题,我有一个包含两个小部件的片段,一个Switch和一个Seekbar。我在Switch打开和关闭时尝试执行一个函数,并且当它跟踪的Seekbar时也是一个方法,这两种方法都会影响这两个小部件,例如假设我们有一个Dimmable Light,我们可以打开或关闭或者我们也可以调暗光亮度,这就是我所说的。

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

setOnCheckedChanged,但问题是当我移动搜索栏以更改Dim时我必须更改检查Switch的状态,当时这个小部件再次触发setOnCheckedChanged事件,所以我得到类似循环的东西。

我的问题是,有什么方法可以将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_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);
    }
}

1 个答案:

答案 0 :(得分: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);
        }
    }

然后在影响第一个侦听器的另一个widget侦听器中,设置null侦听器,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);
        }
    });

希望它的帮助