如何区分开关,复选框值是由用户还是以编程方式(包括保留)更改? [英] How can I distinguish whether Switch,Checkbox Value is changed by user or programmatically (including by retention)?

查看:260
本文介绍了如何区分开关,复选框值是由用户还是以编程方式(包括保留)更改?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
//如何检查复选框/开关已经被用户检查了
//或者已经被编程检查了?

if(isNotSetByUser())
return;
handleSetbyUser
}
});

如何实现 isNotSetByUser()

解决方案

回答2:



p>

使用OnClickListener而不是OnCheckedChangeListener

  someCheckBox.setOnClickListener(new OnClickListener ){

@Override
public void onClick(View v){
//您可能会保留对CheckBox的引用以避免此类转换
boolean checked = ((CheckBox)v).isChecked();
setSomeBoolean(checked);
}

}

现在,您只需选择点击事件,而不必担心程序化更改。






答案1:



我已经创建了一个包装类Pattern)以封装的方式处理这个问题:

  public class BetterCheckBox extends CheckBox {
private CompoundButton.OnCheckedChangeListener myListener = null;
private CheckBox myCheckBox;

public BetterCheckBox(Context context){
super(context);
}

public BetterCheckBox(上下文上下文,CheckBox复选框){
this(context);
this.myCheckBox = checkBox;
}

//这里的分类构造函数...

@Override
public void setOnCheckedChangeListener(
CompoundButton.OnCheckedChangeListener listener){
if(listener!= null){
this.myListener = listener;
}
myCheckBox.setOnCheckedChangeListener(listener);
}

public void silentlySetChecked(boolean checked){
toggleListener(false);
myCheckBox.setChecked(checked);
toggleListener(true);
}

private void toggleListener(boolean on){
if(on){
this.setOnCheckedChangeListener(myListener);
}
else {
this.setOnCheckedChangeListener(null);
}
}
}

CheckBox仍然可以声明为同样在XML中,但在代码初始化GUI时使用这个:

  BetterCheckBox myCheckBox; 

//后来...
myCheckBox = new BetterCheckBox(context,
(CheckBox)view.findViewById(R.id.my_check_box));

如果要设置从代码检查而不触发侦听器,请调用 myCheckBox .silentlySetChecked(someBoolean)而不是 setChecked


setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // How to check whether the checkbox/switch has been checked
                // by user or it has been checked programatically ?

                if (isNotSetByUser())
                    return;
                handleSetbyUser();
            }
        });

How to implement method isNotSetByUser()?

解决方案

Answer 2:

A very simple answer:

Use on OnClickListener instead of OnCheckedChangeListener

    someCheckBox.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            // you might keep a reference to the CheckBox to avoid this class cast
            boolean checked = ((CheckBox)v).isChecked();
            setSomeBoolean(checked);
        }

    });

Now you only pick up click events and don't have to worry about programmatic changes.


Answer 1:

I have created a wrapper class (see Decorator Pattern) which handles this problem in an encapsulated way:

public class BetterCheckBox extends CheckBox {
    private CompoundButton.OnCheckedChangeListener myListener = null;
    private CheckBox myCheckBox;

    public BetterCheckBox(Context context) {
        super(context);
    }

    public BetterCheckBox(Context context, CheckBox checkBox) {
        this(context);
        this.myCheckBox = checkBox;
    }

    // assorted constructors here...    

    @Override
    public void setOnCheckedChangeListener(
        CompoundButton.OnCheckedChangeListener listener){
        if(listener != null) {
            this.myListener = listener;
        }
        myCheckBox.setOnCheckedChangeListener(listener);
    }

    public void silentlySetChecked(boolean checked){
        toggleListener(false);
        myCheckBox.setChecked(checked);
        toggleListener(true);
    }

    private void toggleListener(boolean on){
        if(on) {
            this.setOnCheckedChangeListener(myListener);
        }
        else {
            this.setOnCheckedChangeListener(null);
        }
    }
}

CheckBox can still be declared the same in XML, but use this when initializing your GUI in code:

BetterCheckBox myCheckBox;

// later...
myCheckBox = new BetterCheckBox(context,
    (CheckBox) view.findViewById(R.id.my_check_box));

If you want to set checked from code without triggering the listener, call myCheckBox.silentlySetChecked(someBoolean) instead of setChecked.

这篇关于如何区分开关,复选框值是由用户还是以编程方式(包括保留)更改?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆