Sous Android, il existe plusieurs façons d'intercepter les événements liés à l'interaction d'un utilisateur avec votre application. Lorsque vous examinez les événements de votre interface utilisateur, l'approche consiste à capturer les événements l'objet View spécifique avec lequel l'utilisateur interagit. La classe View permet d'effectuer cette opération.
Dans les différentes classes View que vous utiliserez pour composer votre mise en page, vous remarquerez peut-être plusieurs rappels publics
utiles pour les événements d'interface utilisateur. Ces méthodes sont appelées par le framework Android lorsque
l'action correspondante a lieu sur cet objet. Par exemple, lorsqu'un utilisateur
appuie sur une vue (un bouton, par exemple),
La méthode onTouchEvent() est appelée sur cet objet. Cependant, pour intercepter cela, vous devez étendre
la classe et remplacer la méthode. Toutefois, l'extension de chaque objet View
pour gérer un tel événement
ne serait pas pratique. C'est pourquoi la classe View contient également
une collection d'interfaces imbriquées avec des rappels que vous pouvez définir beaucoup plus facilement. Ces interfaces,
appelés écouteurs d'événements, qui vous permettent de capturer l'interaction de l'utilisateur avec votre interface utilisateur.
Bien que vous utilisiez plus souvent les écouteurs d'événements pour écouter les interactions des utilisateurs, il peut y avoir
vous pouvez étendre une classe View afin de créer un composant personnalisé.
Vous souhaitez peut-être étendre Button
pour rendre quelque chose 
plus sophistiqué. Dans ce cas, vous pouvez définir les comportements d'événements par défaut
à l'aide de la classe event handlers.
Écouteurs d'événements
Un écouteur d'événements est une interface de la classe View contenant un seul
. Ces méthodes seront appelées par le framework Android lorsque la vue sur laquelle l'écouteur a
est déclenchée par une interaction de l'utilisateur avec l'élément dans l'UI.
Les interfaces d'écouteur d'événements incluent les méthodes de rappel suivantes:
- onClick()
- À partir de View.OnClickListener. Cette méthode est appelée lorsque l'utilisateur touche l'élément (en mode Écran tactile), ou se concentre sur l'élément à l'aide des touches de navigation ou du trackball et appuie sur la touche "Entrée" appropriée ou en appuyant de manière prolongée sur le trackball.
- onLongClick()
- À partir de View.OnLongClickListener. Cette méthode est appelée lorsque l'utilisateur appuie de manière prolongée sur l'élément (en mode Écran tactile), ou se concentre sur l'élément à l'aide des touches de navigation ou du trackball et doit appuyer de manière prolongée sur la touche "Entrée" appropriée ou appuie longuement sur le trackball (pendant une seconde).
- onFocusChange()
- À partir de View.OnFocusChangeListener. Cette méthode est appelée lorsque l'utilisateur accède à l'élément ou en sort à l'aide des touches de navigation ou du trackball.
- onKey()
- À partir de View.OnKeyListener. Cette méthode est appelée lorsque l'utilisateur sélectionne l'élément et appuie ou libère une touche matérielle sur l'appareil.
- onTouch()
- À partir de View.OnTouchListener. Elle est appelée lorsque l'utilisateur effectue une action qualifiée d'événement tactile, y compris une pression, un relâchement ou tout geste de mouvement à l'écran (dans les limites de l'élément).
- onCreateContextMenu()
- À partir de View.OnCreateContextMenuListener. Ce procédé est appelé lors de la création d'un menu contextuel (à la suite d'un "clic long" prolongé). Lire la discussion sur les menus contextuels des Menus guide du développeur.
Ces méthodes sont les seules utilisateurs de leur interface respective. Pour définir l'une de ces méthodes,
et gérer vos événements, implémentez l'interface imbriquée dans votre Activity ou définissez-la en tant que classe anonyme.
Ensuite, transmettez une instance de votre implémentation
à la méthode View.set...Listener() correspondante. (par exemple, appeler
setOnClickListener()OnClickListener.)
L'exemple ci-dessous montre comment enregistrer un écouteur de clics pour un bouton.
Kotlin
protected void onCreate(savedValues: Bundle) { ... val button: Button = findViewById(R.id.corky) // Register the onClick listener with the implementation above button.setOnClickListener { view -> // do something when the button is clicked } ... }
Java
// Create an anonymous implementation of OnClickListener private OnClickListener corkyListener = new OnClickListener() { public void onClick(View v) { // do something when the button is clicked } }; protected void onCreate(Bundle savedValues) { ... // Capture our button from layout Button button = (Button)findViewById(R.id.corky); // Register the onClick listener with the implementation above button.setOnClickListener(corkyListener); ... }
Il peut également s'avérer plus pratique d'implémenter OnClickListener dans votre Activity. Cela permet d'éviter le chargement de classe supplémentaire et l'allocation d'objets. Exemple :
Kotlin
class ExampleActivity : Activity(), OnClickListener { protected fun onCreate(savedValues: Bundle) { val button: Button = findViewById(R.id.corky) button.setOnClickListener(this) } // Implement the OnClickListener callback fun onClick(v: View) { // do something when the button is clicked } }
Java
public class ExampleActivity extends Activity implements OnClickListener { protected void onCreate(Bundle savedValues) { ... Button button = (Button)findViewById(R.id.corky); button.setOnClickListener(this); } // Implement the OnClickListener callback public void onClick(View v) { // do something when the button is clicked } ... }
Notez que dans l'exemple ci-dessus, le rappel onClick() a
aucune valeur renvoyée, mais d'autres méthodes d'écouteur d'événements doivent renvoyer une valeur booléenne. La raison
dépend de l'événement. Voici pourquoi:
- onLongClick()
- onKey()
- onTouch()
N'oubliez pas que les événements de touche matérielle sont toujours envoyés à la vue active. Elles sont envoyées en partant du haut
de la hiérarchie des vues, puis vers le bas, jusqu'à ce qu'ils atteignent la destination appropriée. Si votre vue (ou un enfant de votre vue)
est actuellement sélectionné, vous pouvez voir l'événement transiter par la méthode dispatchKeyEvent()onKeyDown()onKeyUp()
De plus, lorsque vous réfléchissez à la saisie de texte pour votre application, n'oubliez pas que de nombreux appareils ne disposent que d'une entrée logicielle.
méthodes. Ces méthodes ne doivent pas nécessairement être basées sur des clés. certaines peuvent utiliser la saisie
vocale, l'écriture manuscrite, etc. Même si
mode de saisie présente une interface semblable à un clavier, il ne déclenche généralement pas le
Famille d'événements onKeyDown()IME_ACTION_DONE pour signaler
la manière dont votre application s'attend à réagir, ce qui peut modifier son UI de manière significative. Éviter les suppositions
sur le fonctionnement d'un mode de saisie logiciel et faites-vous confiance
pour fournir du texte déjà formaté à votre application.
Remarque:Android appelle d'abord les gestionnaires d'événements, puis les gestionnaires d'événements par défaut les gestionnaires de la définition de classe. Par conséquent, si vous renvoyez la valeur true à partir de ces écouteurs d'événements, la propagation de l'événement aux autres écouteurs d'événements et bloquera également le rappel vers gestionnaire d'événements par défaut dans la vue. Assurez-vous donc de vouloir arrêter l'événement lorsque vous renvoyez true.
Gestionnaires d'événements
Si vous créez un composant personnalisé à partir d'une vue, vous pourrez définir plusieurs méthodes de rappel utilisés comme gestionnaires d'événements par défaut. Dans le document sur les Règles Voir les composants, vous découvrirez certains des rappels courants utilisés pour la gestion des événements, y compris:
- onKeyDown(int, KeyEvent)
- onKeyUp(int, KeyEvent)
- onTrackballEvent(MotionEvent)
- onTouchEvent(MotionEvent)
- onFocusChanged(boolean, int, Rect)
Il existe d'autres méthodes que vous devez connaître, qui ne font pas partie de la classe View, mais cela peut avoir un impact direct sur la façon dont vous êtes en mesure de gérer les événements. Ainsi, lorsque vous gérez des événements plus complexes à l'intérieur une mise en page, envisagez ces autres méthodes:
- Activity.dispatchTouchEvent(MotionEvent)- Activityd'intercepter tous les événements tactiles avant qu'ils ne soient envoyés à la fenêtre.
- ViewGroup.onInterceptTouchEvent(MotionEvent)- ViewGroupde surveiller les événements lorsqu'ils sont envoyés aux vues enfants.
- ViewParent.requestDisallowInterceptTouchEvent(boolean)- onInterceptTouchEvent(MotionEvent)
Mode Écran tactile
Lorsqu'un utilisateur navigue dans une interface utilisateur à l'aide de touches directionnelles ou d'un trackball, il est nécessaire pour se concentrer sur les éléments exploitables (comme les boutons) afin que l'utilisateur puisse voir qui accepte la saisie. Toutefois, si l'appareil est doté de fonctionnalités tactiles et que l'utilisateur commence à interagir avec l'interface en la touchant, alors il n'est plus nécessaire de mettre en évidence des éléments ou se concentrer sur une vue en particulier. Il existe donc un mode pour une interaction appelée "mode tactile".
Pour un appareil tactile, une fois que l'utilisateur touche l'écran, l'appareil
passe en mode tactile.  Désormais, seules les vues pour lesquelles
isFocusableInTouchMode() est défini sur "true", comme les widgets d'édition de texte.
Les autres vues sur lesquelles il est possible d'appuyer, comme les boutons, ne sont pas mises en évidence lorsque l'utilisateur appuie dessus. elle fera
déclenchez simplement leurs écouteurs de clics lorsque l'utilisateur appuie dessus.
Chaque fois qu'un utilisateur appuie sur une touche directionnelle ou fait un défilement avec un trackball, l'appareil quitter le mode tactile et trouver une vue pour faire la mise au point. L'utilisateur peut à nouveau interagir avec l'interface utilisateur sans toucher l'écran.
Le mode tactile est conservé dans l'ensemble du système (toutes les fenêtres et activités).
Pour interroger l'état actuel, vous pouvez appeler
isInTouchMode() pour voir si l'appareil est actuellement en mode Écran tactile.
Gérer la sélection
Le framework gère le mouvement de sélection de routine en réponse à l'entrée utilisateur.
Par exemple, vous pouvez modifier le curseur lorsque des vues sont supprimées ou masquées, ou lorsque de nouvelles vues sont ajoutées.
Des vues deviennent disponibles. Les vues indiquent qu'elles sont prêtes à se concentrer
via la méthode isFocusable()setFocusable()isFocusableInTouchMode()setFocusableInTouchMode()
Sur les appareils équipés d'Android 9 (niveau d'API 28) ou version ultérieure, les activités n'attribuent pas le focus initial. Au lieu de cela, vous devez demander explicitement la sélection initiale, si vous le souhaitez.
Le mouvement de mise au point est basé sur un algorithme qui trouve le voisin le plus proche dans un une direction donnée. Dans de rares cas, il se peut que l'algorithme par défaut ne corresponde pas au le comportement souhaité du développeur. Dans ces situations, vous pouvez fournir remplacements explicites par les attributs XML suivants dans le fichier de mise en page: nextFocusDown, nextFocusLeft, nextFocusRight et nextFocusUp Ajoutez l'un de ces attributs à la colonne View from, l'objectif est de partir. Définit la valeur de l'attribut comme étant l'identifiant de la vue. to l'élément à cibler. Exemple :
<LinearLayout android:orientation="vertical" ... > <Button android:id="@+id/top" android:nextFocusUp="@+id/bottom" ... /> <Button android:id="@+id/bottom" android:nextFocusDown="@+id/top" ... /> </LinearLayout>
Habituellement, dans cette mise en page verticale, le fait de remonter à partir du premier bouton ne ni de descendre depuis le deuxième bouton. Maintenant que le bouton du haut a défini celui du bas comme nextFocusUp (et inversement), le focus de navigation de haut en bas et de bas en haut.
Si vous souhaitez déclarer une vue comme sélectionnable dans votre interface utilisateur (quand elle ne l'est généralement pas),
Ajoutez l'attribut XML android:focusable à la vue dans votre déclaration de mise en page.
Définissez la valeur true. Vous pouvez également déclarer une vue
comme sélectionnable lorsque vous êtes en mode Écran tactile avec android:focusableInTouchMode.
Pour demander le focus d'une vue particulière, appelez requestFocus()
Pour écouter les événements de sélection (être averti lorsqu'une vue est sélectionnée ou non), utilisez
onFocusChange()
 
  