2016-06-08 68 views
2

我有一个开关,一个听众:开关设置经过假

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),那么正常行为是跳过回调?或者它是一个错误?

回答

1

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

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

+0

好了,我的一些业务逻辑在回调...所以我不得不复制。 – Jumpa

0

的回调将只有当你确定你的监听器被调用,后记试图通过setChecked(假/真)

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(); 
      } 
     });