我有一个带有听众的开关:
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),则正常行为是跳过回调吗?或者这是一个错误?
答案 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)更改它