2016-06-08 23 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(); 
      } 
     });