Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Beberapa perangkat Wear OS memiliki tombol putar samping dalam bentuk fisik. Saat diputar,
tombol akan men-scroll tampilan aplikasi Anda saat ini ke atas atau ke bawah. Jenis input ini disebut
input tombol putar.
Catatan: Panduan ini terutama merujuk pada penanganan input dari tombol putar menggunakan
UI berbasis Tampilan. Untuk informasi lengkap cara menangani input dari tombol putar menggunakan Compose untuk Wear OS, lihat
Input dari tombol putar di Compose.
Banyak penampung yang dapat di-scroll, seperti
ScrollView,
ListView,
HorizontalScrollView,
dan WearableRecyclerView,
mendukung input dari tombol putar jika penampung tersebut memiliki fokus yang tidak memerlukan kode khusus Wear
OS apa pun.
Fokus merupakan prasyarat yang penting, karena pada Android 9 (level API
28) dan yang lebih tinggi, tampilan tidak secara implisit menerima fokus.
Praktik terbaik fokus
Untuk merespons peristiwa input dari tombol putar, penampung yang dapat di-scroll harus memiliki fokus.
Peristiwa input dari tombol putar tidak menggelembungkan hierarki
tampilan. Jika tidak ada tampilan yang difokuskan, atau jika tampilan yang difokuskan menampilkan false dari
View.onGenericMotionEvent(),
peristiwa akan dikirim ke
Activity.onGenericMotionEvent().
Berikut adalah praktik terbaik untuk merespons peristiwa input dari tombol putar:
Perlu diingat bahwa, secara default, meluncurkan aktivitas atau mengetuk
tampilan tidak akan memberinya fokus, meskipun
dapat difokuskan. Untuk memberi fokus pada tampilan Anda, tampilan harus menggunakan tag
<requestFocus />
atau memanggil View.requestFocus() secara manual.
Menandai tampilan kustom yang dapat di-scroll sebagai dapat difokuskan menggunakan android:focusable="true"
dan android:focusableInTouchMode="true".
Jika tampilan yang dapat di-scroll dilampirkan setelah Activity.onCreate()—
misalnya, menunggu permintaan jaringan selesai sebelum mem-build UI, panggil
requestFocus() setelah melampirkannya.
Jika tampilan yang dapat di-scroll pada awalnya adalah INVISIBLE
atau GONE,
panggil requestFocus() saat Anda menetapkannya ke
VISIBLE.
Jika aktivitas Anda berisi beberapa tampilan yang dapat di-scroll, pilih salah satu untuk difokuskan menggunakan
tag
<requestFocus />. Scrolling bertingkat tidak didukung dengan tombol putar samping.
Jika UI Anda berisi beberapa tampilan lain yang membutuhkan fokus saat pengguna
berinteraksi dengannya—misalnya
InputText, berikan cara kepada pengguna untuk memulihkan fokus ke tampilan yang dapat di-scroll
jika kehilangan fokus dengan memproses ketukan pada tampilan yang dapat di-scroll dan memanggil
requestFocus() sebagai respons.
Perilaku rotasi kustom
Jika tampilan yang dapat di-scroll secara native tidak mendukung input scroll dari tombol putar, atau jika Anda ingin
menggunakan input dari tombol putar untuk melakukan sesuatu selain men-scroll tampilan—misalnya untuk
memperbesar dan memperkecil atau memutar tombol—Anda dapat menangani peristiwa scroll
sendiri. Jangan lupa untuk memastikan tampilan Anda mendapatkan fokus. Jika tidak,
peristiwa tidak akan muncul.
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;}});
Menguji menggunakan emulator
Gunakan Android Emulator untuk menyimulasikan input scroll dari tombol putar
pada perangkat Wear. Luncurkan aplikasi Wear pada emulator untuk menjalankan
project, atau tarik
file APK ke emulator untuk menginstalnya.
Untuk menguji input dari tombol putar pada emulator:
Dari SDK Manager, gunakan tab SDK Tools untuk
mendapatkan Android Emulator 26.0.3 atau yang lebih tinggi.
Di Android Studio, pilih Tools >
Android > AVD Manager.
Buat perangkat Wear baru dengan API 25 atau
yang lebih tinggi.
Klik menu tambahan tiga titik di bagian bawah toolbar emulator. Klik tab
Rotary input dalam jendela baru untuk membuka antarmuka input tombol putar dan coba berikan input.
Video berikut menunjukkan input dari tombol putar dalam emulator:
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-07-26 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 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:"]]