Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Certains appareils Wear OS disposent d'un bouton latéral rotatif. Lorsque l'utilisateur tourne le bouton, la vue active de votre application défile vers le haut ou vers le bas. Ce type d'entrée est appelé saisie par dispositif rotatif.
Remarque : Ce guide concerne principalement la gestion de la saisie par dispositif rotatif à l'aide d'interfaces utilisateur basées sur les vues. Pour en savoir plus sur la gestion de la saisie par dispositif rotatif à l'aide de Compose pour Wear OS, consultez la page Saisie par dispositif rotatif sur Compose.
De nombreux conteneurs à défilement, tels que ScrollView, ListView, HorizontalScrollView et WearableRecyclerView, acceptent les saisies par dispositif rotatif si celles-ci sont ciblées, sans nécessiter de code spécifique à Wear OS.
Le ciblage est une condition préalable déterminante, car sur Android 9 (niveau d'API 28) ou version ultérieure, les vues ne sont pas implicitement activées.
Bonnes pratiques sur le ciblage
Pour répondre à des événements de saisie par dispositif rotatif, un conteneur à défilement doit être sélectionné.
Ces événements ne remontent pas dans la hiérarchie des vues. Si aucune vue active n'est disponible ou si la vue ciblée renvoie false à partir de View.onGenericMotionEvent(), l'événement est envoyé à Activity.onGenericMotionEvent().
Vous trouverez ci-dessous les bonnes pratiques à suivre pour répondre aux événements de saisie par dispositif rotatif :
Par défaut, le fait de lancer une activité, voire d'appuyer sur une vue, ne permet pas de la cibler, même si elle est sélectionnable. Pour cibler la vue, elle doit utiliser la balise <requestFocus /> ou appeler manuellement View.requestFocus().
Marquez les vues déroulantes personnalisées comme sélectionnables avec android:focusable="true" et android:focusableInTouchMode="true".
Si la vue déroulante est associée après Activity.onCreate() (par exemple, dans l'attente de la fin d'une requête réseau avant de créer votre UI), appelez requestFocus() après l'avoir associée.
Si la vue déroulante est initialement INVISIBLE ou GONE, appelez requestFocus() lorsque vous la définissez sur VISIBLE.
Si votre activité contient plusieurs vues à défilement, sélectionnez celle que vous souhaitez utiliser via la balise <requestFocus />. Le défilement intégré n'est pas compatible avec le bouton rotatif latéral.
Si votre interface utilisateur contient une autre vue qui s'active lorsque l'utilisateur interagit avec elle (par exemple, une zone InputText), donnez-lui la possibilité de restaurer la vue à défilement si elle n'est plus ciblée en écoutant les gestes de pression sur la vue à défilement et en appelant requestFocus() en réponse.
Comportement rotatif personnalisé
Si votre vue à défilement n'est pas compatible de manière native avec le défilement via un dispositif rotatif, ou si vous souhaitez utiliser la saisie par dispositif rotatif pour autre chose que le défilement (par exemple, pour faire un zoom avant ou arrière ou pour faire avancer ou reculer l'heure), vous pouvez gérer les événements de défilement vous-même. Rappelez-vous que la vue doit pouvoir être ciblée. Dans le cas contraire, les événements ne seront pas concluants.
myView.setOnGenericMotionListener{v,ev->
if(ev.action==MotionEvent.ACTION_SCROLL&&
ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)){// Don't forget the negation herevaldelta=-ev.getAxisValue(MotionEventCompat.AXIS_SCROLL)*ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(context),context)// Swap these axes to scroll horizontally insteadv.scrollBy(0,delta.roundToInt())true}else{false}}
Java
myView.setOnGenericMotionListener(newView.OnGenericMotionListener(){@OverridepublicbooleanonGenericMotion(Viewv,MotionEventev){if(ev.getAction()==MotionEvent.ACTION_SCROLL&&
ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)){// Don't forget the negation herefloatdelta=-ev.getAxisValue(MotionEventCompat.AXIS_SCROLL)*ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(context),context);// Swap these axes to scroll horizontally insteadv.scrollBy(0,Math.round(delta));returntrue;}returnfalse;}});
Effectuer des tests à l'aide d'un émulateur
Utilisez l'émulateur Android pour simuler un défilement via le dispositif rotatif sur un appareil Wear. Lancez votre application Wear sur l'émulateur pour exécuter votre projet ou faites glisser un fichier APK sur l'émulateur pour l'installer.
Pour tester la saisie par dispositif rotatif sur l'émulateur, procédez comme suit :
Dans le SDK Manager, accédez à l'onglet SDK Tools pour télécharger Android Emulator 26.0.3 ou une version ultérieure.
Dans Android Studio, sélectionnez Tools > Android > AVD Manager (Outils > Android > AVD Manager).
Créez un appareil Wear avec l'API 25 ou version ultérieure.
Cliquez sur le menu à trois points en bas de la barre d'outils de l'émulateur. Cliquez sur l'onglet Rotary input (Saisie par dispositif rotatif) dans la nouvelle fenêtre pour ouvrir l'interface correspondante, puis testez le défilement via ce dispositif.
La vidéo suivante présente la saisie par dispositif rotatif dans l'émulateur :
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/26 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/26 (UTC)."],[],[],null,["# Rotary input\n\nSome Wear OS devices contain a physical *rotating side button* . When the user turns the\nbutton, it scrolls your app's current view up or down. This type of input is called\n*rotary input*.\n\n**Note:** This guide refers primarily to handling rotary input using\nView-based UIs. For more information on handling rotary input using Compose for Wear OS, see\n[Rotary input on Compose](/training/wearables/compose/rotary-input).\n\nMany scrollable containers, like\n[ScrollView](/reference/android/widget/ScrollView),\n[ListView](/reference/android/widget/ListView),\n[HorizontalScrollView](/reference/android/widget/HorizontalScrollView),\nand [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView),\nsupport rotary input if they have focus without requiring any Wear\nOS-specific code.\nHaving focus is an important prerequisite, because on Android 9 (API level\n28) and higher, views don't implicitly receive focus.\n\nFocus best practices\n--------------------\n\n\nTo respond to rotary input events, a scrollable container must have focus.\nRotary input events don't bubble up the view\nhierarchy. If there is no focused view, or if the focused view returns `false` from\n[View.onGenericMotionEvent()](/reference/android/view/View#onGenericMotionEvent(android.view.MotionEvent)),\nthen the event is sent to\n[Activity.onGenericMotionEvent()](/reference/android/app/Activity#onGenericMotionEvent(android.view.MotionEvent)).\n\n\nThe following are best practices around responding to rotary input events:\n\n- Bear in mind that, by default, launching an activity or even tapping on a view does not give it focus, even if it is focusable. To give your view focus, the view must use the [<requestFocus /\u003e](/guide/topics/resources/layout-resource) tag or manually call [View.requestFocus()](/reference/android/view/View#requestFocus()).\n- Mark custom scrollable views as focusable using both `android:focusable=\"true\"` and `android:focusableInTouchMode=\"true\"`.\n- If your scrollable view is attached after [Activity.onCreate()](/reference/android/app/Activity#onCreate(android.os.Bundle))---for example, waiting for a network request to finish before building your UI, call `requestFocus()` after attaching it.\n- If your scrollable view is initially [INVISIBLE](/reference/android/view/View#INVISIBLE) or [GONE](/reference/android/view/View#GONE), call `requestFocus()` when you set it to [VISIBLE](/reference/android/view/View#VISIBLE).\n- If your activity contains multiple scrollable views, choose one to focus using the [<requestFocus /\u003e](/guide/topics/resources/layout-resource) tag. Nested scrolling is not supported with the rotating side button.\n- If your UI contains some other view that takes focus when the user interacts with it---for example, an `InputText`, give the user a way to restore focus to the scrollable view if it loses focus by listening for taps on the scrollable view and calling `requestFocus()` in response.\n\nCustom rotating behavior\n------------------------\n\nIf your scrollable view doesn't natively support rotary input scrolling, or if you want to\nuse your rotary input for something other than scrolling---such as to\nzoom in and out or to turn dials---you can handle the scroll events\nyourself. Remember to make sure your view gains focus, otherwise\nthe events will not come through.\n\nThe following code snippet shows how to use [MotionEvent](/reference/android/view/MotionEvent),\n[InputDeviceCompat](/reference/kotlin/androidx/core/view/InputDeviceCompat),\nand [ViewConfigurationCompat](/reference/androidx/core/view/ViewConfigurationCompat)\nto add custom scrolling to your view: \n\n### Kotlin\n\n```kotlin\nmyView.setOnGenericMotionListener { v, ev -\u003e\n if (ev.action == MotionEvent.ACTION_SCROLL &&\n ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)\n ) {\n // Don't forget the negation here\n val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *\n ViewConfigurationCompat.getScaledVerticalScrollFactor(\n ViewConfiguration.get(context), context\n )\n // Swap these axes to scroll horizontally instead\n v.scrollBy(0, delta.roundToInt())\n true\n } else {\n false\n }\n}\n```\n\n### Java\n\n```java\nmyView.setOnGenericMotionListener(new View.OnGenericMotionListener() {\n @Override\n public boolean onGenericMotion(View v, MotionEvent ev) {\n if (ev.getAction() == MotionEvent.ACTION_SCROLL &&\n ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)\n ) {\n // Don't forget the negation here\n float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *\n ViewConfigurationCompat.getScaledVerticalScrollFactor(\n ViewConfiguration.get(context), context\n );\n\n // Swap these axes to scroll horizontally instead\n v.scrollBy(0, Math.round(delta));\n\n return true;\n }\n return false;\n }\n});\n```\n\nTest using an emulator\n----------------------\n\nUse the [Android Emulator](/studio/run/emulator#about) to simulate rotary input\nscrolling on a Wear device. Launch your Wear app on the emulator to run\nyour project or drag an\nAPK file onto the emulator to install it.\n\nTo test the rotary input on the emulator:\n\n1. From the [SDK manager](/tools/help/sdk-manager), use the **SDK tools** tab to get Android Emulator 26.0.3 or higher.\n2. In Android Studio, select **Tools \\\u003e\n Android \\\u003e AVD Manager** . [Create a new Wear device](/studio/run/managing-avds#createavd) with API 25 or higher.\n3. [Run the emulator from Android Studio](/studio/run/emulator#runningapp).\n4. Click the three-dot overflow menu at the bottom of the emulator toolbar. Click the **Rotary input** tab in the new window to open the rotary input interface and try rotary input scrolling.\n\nThe following video shows rotary input in the emulator:"]]