setEnabled () vs setClickable (), в чем разница?

до сих пор, когда я хотел остановить пользователя от нажатия кнопки, я бы установил button.setClickable(false); и обычно меняют текст на какой-то серый цвет (чтобы пользователь знал, что кнопка отключена). Сегодня я наткнулся на setEnabled() собственность.

поэтому я пошел в документацию, чтобы увидеть объяснение метода ниже:

setEnabled(boolean enabled)
   Set the enabled state of this view.

что это вообще значит? В чем разница между enable state/clickable state и disabled state/not clickable state? Может кто-нибудь объяснить, в чем разница между тем, что я делал раньше, используя свойство clickable и используя setEnabled() собственность? Что следует использовать, когда? Я искал StackOverflow, но не смог найти ничего связанного. Спасибо заранее.

6 ответов


что это значит?

цитирую страница Википедии для "GUI widget":

в контексте приложения виджет может быть включен или отключен в определенный момент времени. Виджет enabled имеет способность реагировать на события, такие как нажатия клавиш или действий мыши. Виджет, который не может отвечать на такие события, считается отключенным. Внешний вид отключенного виджета обычно отличается от включенного виджет; отключенный виджет может быть нарисован более светлым цветом или визуально затемнен каким-либо образом. См. изображение справа для примера.

эта концепция существует уже несколько десятилетий и может быть найдена в большинстве фреймворков GUI.

в чем разница между enable state / clickable state и disabled state / not clickable state?

В Android, виджет, который не является активным и не будет реагировать на события click. Ля отключенный виджет не только не кликабелен, но и визуально указывает на то, что он отключен.

что вы подразумеваете под: "..так как это делает кнопку визуально "отключенной"? как он изменяет его визуально?

что делает Button смотрите и отвечайте как Button - Это его фон, который является StateListDrawable. Для отключенного состояния используется определенный образ.


таким образом, в основном включен false не отвечает на какой-либо ответ и кликабельный false еще Ответ, Когда установлен во время выполнения, и поверьте мне, я просто попробовал.


Как сказал Дилип, setClickable не работает, если он установлен во время выполнения. Вот трюк, чтобы заставить его работать:

ToggleButton toggle = ...
toggle.setOnTouchListener(new ToggleButton.OnTouchListener() {

  @Override
  public boolean onTouch(View v, MotionEvent event) {
     // If true is returned, the event is eated by the TouchListener
     return !v.isClickable();
  }
});

представления также могут реагировать на внешние клавиатуры, направленные колодки (удаленные / игровые контроллеры) и вспомогательные устройства (переключатель, скринридер).


различия перечислены выше, но есть подсказка. используйте setClickable () после setOnClickListener (). Из-за этого:

public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}

setClickable public void setClickable (boolean clickable)

Он включает или отключает события щелчка для конкретного представления. Когда представление кликабельно, оно изменит свое состояние на "нажатое"при каждом щелчке. если это свойство представления отключено, оно не изменит свое состояние.

setEnabled public void setEnabled (включено логическое значение)

Это установлено состояние данного вида .Если для конкретного представления задано значение enabled, передайте true в параметре else pass false