2013-03-20 70 views
3

我有一個複選框,可以動態禁用並綁在點擊監聽器:安卓:禁用複選框不響應點擊事件

CheckBox chkbox = (CheckBox)findViewById(R.id.chkboxid); 

if(condition) { 
    chkbox.setEnabled(false); 
    chkbox.setOnClickListener(displayPopup); 
} else { 
    chkbox.setOnClickListener(handleToggle); 
} 

這樣做的目的是,如果該複選框被禁用,我想給點擊複選框的用戶可以瞭解更多有關爲什麼該選項被禁用的信息。

我已經意識到被禁用的小部件不會發送點擊事件來點擊偵聽器。我曾經試圖通過執行以下操作設置它存在於爲可點擊的LinearLayout

CheckBox chkbox = (CheckBox)findViewById(R.id.checkboxName); 
LinearLayout layout = (LinearLayout)findViewById(R.id.layoutName); 
if(condition) { 
    chkbox.setEnabled(false); 
    layout.setClickable(true); 
    layout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
    layout.setOnClickListener(displayPopup); 
} else { 
    chkbox.setOnClickListener(handleToggle); 
} 

這適用於點擊除了在禁用複選框LinearLayout內的任何地方。它沒有遵循FOCUS_BLOCK_DESCENDANTS設置。我也嘗試在複選框上放置一個不可見的可點擊對象,但在那裏也沒有成功。有任何想法嗎?

編輯:我們現在卡在API lvl 8中,否則我會嘗試降低複選框的alpha值而不是禁用它,以至少模擬被禁用的外觀。

回答

2

安卓禁用複選框不響應點擊事件

我想如果CheckBox或其他類型的widget被禁用,任何一個事件可以被處理。

但是如何做出簡單的伎倆。假設啓用CheckBox,並且當某些需要的內容未被填滿時,始終將檢查狀態設置爲false。它看起來像「我不能勾選複選框,有什麼不好」並通過吐司顯示一些警告消息。

checkBox.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (somethingIsNotFilledUp) { 
      checkBox.setChecked(false); 
      Toast.makeText(Main.this, "You didn't fill required fields", Toast.LENGTH_SHORT).show(); 
     } 
     else { 
      // do some stuff 
     } 
    } 
}); 

我想他們看到了差距

您可以通過使用自定義的複選框的外觀實現它。

+0

我考慮過這個。問題是我希望用戶能夠直觀地看到它被啓用或禁用,因爲條件可能會改變,而用戶無需主動做任何事情。這可能聽起來令人困惑,但根據其他用戶(如管理員)的設置,條件是真或假,如果管理員用戶決定使其可用,我希望他們看到不同之處。 – nagem 2013-03-20 22:18:25

+1

@Megan你可以用自定義複選框背景實現它:) – Sajmon 2013-03-20 22:28:05

+0

這就是我的團隊最終決定的。去使用一些信息[這裏](http:// stackoverflow。com/questions/3965484/custom-checkbox-image-android)作爲參考。 – nagem 2013-03-21 18:10:49

1

無法接收事件上被禁用的複選框,但我做了其他的招模擬禁用複選框,在那裏你可以得到複選框事件,並使其按長按它例如

Simulating disabled checkbox receiving events

希望這有助於您

0

您可以使用CustomSwitchCompat樣本創建自定義複選框。我認爲它會起作用。 希望這有助於

public class CustomSwitchCompat extends SwitchCompat { 

    private GestureDetector gestureDetector; 

    public CustomSwitchCompat(Context context) { 
     super(context); 
     gestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if (gestureDetector.onTouchEvent(ev)) { 
      if (!isEnabled()) { 
       callOnClick(); 
      } 
     } 
     return super.onTouchEvent(ev); 
    } 

    private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onSingleTapUp(MotionEvent event) { 
      return true; 
     } 
    } 
}