开关设置检查错误

Switch Set Checked False

我有一个带监听器的 Switch:

mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
}

正在做:

mSwitch.setChecked(false);

没有效果,没有触发回调。 而是这样:

mSwitch.setChecked(true);
mSwitch.setChecked(false);

按预期工作。难道我做错了什么?如果复选框状态为 false 并且使用 setChecked(false),正常行为是跳过回调?或者这是一个错误?

它将在复合按钮的选中状态发生变化时调用。

所以如果它的状态已经是 false,当你调用 false 时它不会被调用。

只有当你定义了你的监听器并且后记尝试通过 setChecked(false/true)

来改变它时,回调才会被调用

不,这不是错误,是正常现象。

如果您查看 CompoundButton 的代码,您会看到

/**
     * <p>Changes the checked state of this button.</p>
     *
     * @param checked true to check the button, false to uncheck it
     */
    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;            
        }
}

其中 mChecked 是开关的实际值。

如果你想每次都触发,像这样简单重写onClick监听器

mSwitch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Is checked? "+mSwitch.isChecked(), Toast.LENGTH_SHORT).show();
            }
        });