setEnabled () проти setClickable (), в чому різниця?


78

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

Тож я перейшов до документації, щоб побачити пояснення методу нижче:

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

Що це взагалі означає? Яка різниця між станом увімкнення / станом, який можна натиснути, та станом відключення / станом, який не можна натиснути? Чи може хтось пояснити, яка різниця між тим, що я робив раніше, використовуючи властивість, що натискається, та використанням setEnabled()властивості? Що слід використовувати коли? Я шукав переповнення стека, але не зміг знайти нічого пов’язаного.


5
Я б здогадався, що setEnabled (false) робить View не клікабельним І нефокусованим, що означає, що він повністю блокується. Крім того, setEnabled (false) є кращим способом у випадку з кнопкою, оскільки вона робить кнопку візуально "відключеною"
Droidman

що ви маєте на увазі під словом: "..оскільки це робить кнопку візуально" вимкненою "? як це змінює її візуально? і що, якщо я користуюся користувацьким селектором?
Еміль Адз

не впевнений у користувацькому селекторі, не тестував його. Але у випадку зі стандартною кнопкою вона стає напівпрозорою, тому вам не потрібно робити це вручну
Droidman 25.03.13

Відповіді:


79

Що, біса, це означає?

Цитуючи сторінку Вікіпедії для "віджета графічного інтерфейсу" :

У контексті програми віджет може бути ввімкнений або вимкнений у певний момент часу. Увімкнений віджет може реагувати на події, такі як натискання клавіш або дії миші. Віджет, який не може відповісти на такі події, вважається відключеним. Зовнішній вигляд відключеного віджета зазвичай відрізняється від увімкненого віджета; відключений віджет може бути намальований світлішим кольором або може бути якимось чином візуально затемнений. Для прикладу див. Зображення праворуч.

Ця концепція існує вже пару десятиліть і її можна знайти в більшості графічних інтерфейсів.

у чому різниця між станом увімкнення / станом, який можна натиснути, та станом відключення / станом, який не можна натиснути?

В Android віджет, який не можна натиснути, не реагуватиме на події кліків. Відключений віджет не тільки не можна натискати, але він також візуально вказує на те, що він відключений.

що ви маєте на увазі під словом: "..оскільки це робить кнопку візуально" відключеною "? як це змінює її візуально?

Те, що робить Buttonпогляд і реагувати як a, Button- це його фон, який є a StateListDrawable. Існує конкретне зображення, яке використовується для стану інвалідів.


@ Maver1ck: Button StateListDrawableОднозначно має відключений стан: github.com/android/platform_frameworks_base/blob/master/core/ ... Можливо, існують інші ефекти, застосовані Buttonкласом, хоча я не знаю про це.
CommonsWare

Я щойно зробив невеликий тест, і, схоже, для кнопок також змінено колір тексту. Він стає сірим, коли я встановлюю значення кнопки увімкненою на false.
FD_

отже, в основному, якщо я користуюся користувацьким селектором? Мені слід вказати певний малювальний файл, якщо я хочу використовувати метод setEnable () на цій конкретній кнопці (і отримати відгук про цю зміну)?
Еміль Адз

@FD_: Ах, так, це TextViewповедінка інвалідів, яка Buttonуспадковує. Кольори тексту часто є ColorStateListоб'єктами, які також можуть мати включені та відключені стани. Вибачте, я забув про це.
CommonsWare

2
@EmilAdz: Якщо ви зміните колір тексту або зміните фон кнопки, вам потрібно буде мати відповідний запис у стані ColorStateListабо StateListDrawableдля відключеного стану. Цей запис буде використаний при setEnabled(false)виклику або android:enabled="false"в макеті.
CommonsWare

6

Отже, в основному ввімкнене false не реагує на жодну відповідь, а натискаюча помилкова нерухома відповідь, встановлена ​​під час виконання, і повірте мені, я щойно спробував.


3

Велика різниця, про яку я не згадую в інших місцях, полягає у перекриваються поданнях. Перегляд із натисканням = true та enabled = false не дозволить вам натиснути View за ним. Але подання з clickkable = false дозволить вам натиснути View за ним.


2

Як сказав Діліп, 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();
  }
});


0

Відмінності перераховані вище, але є підказка. використовувати setClickable () після setOnClickListener (). Тому що:

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

0

setClickable публічна порожнеча setClickable (логічна клацання)

Це вмикає або вимикає події кліків для конкретного подання. Коли вигляд можна натиснути, він змінить свій стан на "натиснутий" при кожному клацанні. якщо цю властивість подання вимкнено, це не змінить свого стану.

setEnabled публічна порожнеча setEnabled (логічне значення увімкнено)

Він встановив увімкнений стан цього подання. Якщо для конкретного подання встановлено значення, тоді передайте true у параметрі else pass false

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.