web-dev-qa-db-fra.com

setEnabled () vs setClickable (), quelle est la différence?

Jusqu'à présent, lorsque je voulais empêcher l'utilisateur d'appuyer sur le bouton, je configurais l'option button.setClickable(false); et changeais le texte en une sorte de couleur grise (pour indiquer à l'utilisateur que le bouton était désactivé). Aujourd'hui, je suis tombé sur la propriété setEnabled().

Je suis donc allé à la documentation pour voir l'explication de la méthode ci-dessous:

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

Qu'est-ce que cela signifie même? Quelle est la différence entre l'état activé/l'état cliquable et l'état désactivé/l'état non cliquable? Quelqu'un pourrait-il expliquer s'il vous plaît quelle est la différence entre faire ce que je faisais précédemment, utiliser la propriété cliquable et utiliser la propriété setEnabled()? Que faut-il utiliser quand? J'ai cherché StackOverflow mais je n'ai rien trouvé de pertinent. Merci d'avance.

62
Emil Adz

Qu'est-ce que ça veut dire?

Citant la page Wikipedia pour "widget d'interface graphique" :

Dans le contexte d'une application, un widget peut être activé ou désactivé à un moment donné. Un widget activé a la capacité de répondre à des événements, tels que des frappes au clavier ou des actions de la souris. Un widget qui ne peut pas répondre à de tels événements est considéré comme désactivé. L'apparence d'un widget désactivé est généralement différente de celle d'un widget activé. le widget désactivé peut être dessiné dans une couleur plus claire ou peut être masqué de manière visuelle. Voir l'image à droite pour un exemple.

Ce concept existe depuis une vingtaine d'années et se retrouve dans la plupart des frameworks d'interface graphique.

quelle est la différence entre l'état activé/l'état cliquable et l'état désactivé/l'état non cliquable?

Sous Android, un widget non cliquable ne répondra pas aux événements liés aux clics. Un widget désactivé est non seulement non cliquable, mais il indique également visuellement qu'il est désactivé.

qu'entendez-vous par: "... puisque le bouton est visuellement" désactivé "? comment change-t-il visuellement?

Ce qui donne à Button un aspect et à réagir comme un Button est son arrière-plan, qui est un StateListDrawable. Une image spécifique est utilisée pour l'état désactivé.

71
CommonsWare

Donc, fondamentalement, un faux activé ne répond à aucune réponse et un faux cliquable reste quand il est défini à l'exécution et croyez-moi, je viens de l'essayer.

3
Dilip Poudel

Les vues peuvent également répondre aux claviers externes, aux pads directionnels (contrôleurs de jeu/à distance) et aux dispositifs d'assistance ( commutateur , lecteurs d'écran ).

1
Renato

Comme l'a dit Dilip, setClickable ne fonctionne pas s'il est défini à l'exécution . Voici une astuce pour le faire fonctionner:

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

setClickable public void setClickable (booléen cliquable)

Il active ou désactive les événements de clic pour la vue particulière. Lorsqu'une vue est cliquable, son état devient "enfoncé" à chaque clic. Si cette propriété de vue est désactivée, elle ne changera pas d'état.

setEnabled public void setEnabled (booléen activé)

Il définit l'état activé de cette vue. Si la vue particulière est configurée pour être activée, transmettez true dans le paramètre sinon pass false

0
Muhammad Abdullah

Une grosse différence que je ne vois pas mentionnée ailleurs concerne les points de vue qui se chevauchent. Une vue avec clickable = true et enabled = false ne vous permettra pas d'appuyer sur une vue derrière celle-ci. Mais une vue avec clickable = false vous permettra d'appuyer sur une vue derrière celle-ci. 

0
Trevor

Les différences sont énumérées ci-dessus, mais il y a un conseil. utilisez setClickable () après setOnClickListener (). À cause de ce:

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