首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改复选框值而不触发onCheckChanged

更改复选框值而不触发onCheckChanged
EN

Stack Overflow用户
提问于 2013-03-20 20:10:54
回答 16查看 70.1K关注 0票数 173

我为我的checkbox实现了setOnCheckedChangeListener

有没有办法我可以打电话给

代码语言:javascript
复制
checkbox.setChecked(false);

而不会触发onCheckedChanged

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2013-03-20 20:25:48

不,你不能这么做。直接从setChecked调用onCheckedChanged方法。您可以执行以下操作:

代码语言:javascript
复制
mCheck.setOnCheckedChangeListener (null);
mCheck.setChecked (false);
mCheck.setOnCheckedChangeListener (mListener);

请参阅source of CheckBoxsetChecked的实现

代码语言:javascript
复制
public void  setChecked(boolean checked) {
    if (mChecked != checked) {
        mChecked = checked;
        refreshDrawableState();

        // 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;            
    }
}
票数 303
EN

Stack Overflow用户

发布于 2018-10-02 18:21:06

在OnCheckedChangeListener中添加以下代码:

代码语言:javascript
复制
if(!compoundButton.isPressed()) {
            return;
}

这将帮助我们找出checkBox状态是通过编程还是通过用户操作进行了更改。

票数 104
EN

Stack Overflow用户

发布于 2014-12-10 08:08:55

实现此目的的另一种可能方法是使用自定义CheckBox,它允许您选择是否要调用侦听器:

代码语言:javascript
复制
public class CheckBox extends AppCompatCheckBox {
    private OnCheckedChangeListener mListener;

    public CheckBox(final Context context) {
        super(context);
    }

    public CheckBox(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }

    public CheckBox(final Context context, final AttributeSet attrs, final int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) {
        mListener = listener;
        super.setOnCheckedChangeListener(listener);
    }

    public void setChecked(final boolean checked, final boolean alsoNotify) {
        if (!alsoNotify) {
            super.setOnCheckedChangeListener(null);
            super.setChecked(checked);
            super.setOnCheckedChangeListener(mListener);
            return;
        }
        super.setChecked(checked);
    }

    public void toggle(boolean alsoNotify) {
        if (!alsoNotify) {
            super.setOnCheckedChangeListener(null);
            super.toggle();
            super.setOnCheckedChangeListener(mListener);
            return;
        }
        super.toggle();
    }
}

Kotlin版本,如果您喜欢:

代码语言:javascript
复制
class CheckBox @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : AppCompatCheckBox(context, attrs, defStyleAttr) {
    private var listener: CompoundButton.OnCheckedChangeListener? = null

    override fun setOnCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener?) {
        this.listener = listener
        super.setOnCheckedChangeListener(listener)
    }

    fun setChecked(checked: Boolean, alsoNotify: Boolean) {
        if (!alsoNotify) {
            super.setOnCheckedChangeListener(null)
            super.setChecked(checked)
            super.setOnCheckedChangeListener(listener)
            return
        }
        super.setChecked(checked)
    }

    fun toggle(alsoNotify: Boolean) {
        if (!alsoNotify) {
            super.setOnCheckedChangeListener(null)
            super.toggle()
            super.setOnCheckedChangeListener(listener)
            return
        }
        super.toggle()
    }
}

示例用法:

代码语言:javascript
复制
checkBox.setChecked(true,false);
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15523157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档