开关设置检查错误

时间:2016-06-08 08:42:47

标签: android android-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),则正常行为是跳过回调吗?或者这是一个错误?

3 个答案:

答案 0 :(得分:1)

当复合按钮的选中状态发生变化时,将被调用。

因此,如果其状态已经为假,则在您调用false时不会被调用。

答案 1 :(得分:1)

不,它不是一个错误,是正常行为。

如果您查看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();
            }
        });

答案 2 :(得分:0)

只有在您定义了侦听器后才会调用回调,并且后面的句子会尝试通过setChecked(false / true)更改它