קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
במכשירי Wear OS מסוימים יש לחצן פיזי מסתובב. כשהמשתמש משנה את ההגדרות
לחצן, גולל למעלה או למטה בתצוגה הנוכחית של האפליקציה. סוג הקלט הזה נקרא
חוגה לקלט הנתונים.
הערה: המדריך הזה מתייחס בעיקר לטיפול בחוגה לקלט הנתונים באמצעות
ממשקי משתמש מבוססי-תצוגה. למידע נוסף על טיפול בקלט חוגה באמצעות 'כתיבה' ל-Wear OS:
חוגה לקלט הנתונים של 'כתיבה'.
מאגרים רבים שניתנים לגלילה, כמו
ScrollView,
ListView,
HorizontalScrollView,
ו-WearableRecyclerView,
תמיכה בחוגה לקלט הנתונים במקרה שהמיקוד, ללא צורך ב-Wear
קוד ספציפי למערכת ההפעלה.
נדרשת התמקדות חשובה, כי ב-Android 9 (רמת API)
28) ומעלה, הצפיות לא מקבלות מיקוד באופן מרומז.
התמקדות בשיטות מומלצות
כדי להגיב לאירועי קלט סיבוביים, מאגר שאפשר לגלול צריך להתמקד בו.
אירועי קלט סיבובי לא יופיעו בבועות
ההיררכיה. אם אין תצוגה ממוקדת, או אם התצוגה שמתמקדת בה מחזירה את הערך false:
View.onGenericMotionEvent(),
האירוע נשלח אל
Activity.onGenericMotionEvent().
ריכזנו כאן שיטות מומלצות לתגובה לאירועי קלט סיבוביים:
חשוב לזכור שכברירת מחדל, צריך להתחיל פעילות או אפילו להקיש על
לא מתמקדת בו,
שניתן להתמקד בו. כדי למקד את התצוגה, צריך להשתמש
<requestFocus />
או להפעיל ידנית View.requestFocus().
סימון תצוגות מותאמות אישית שניתנות לגלילה כניתנות למיקוד באמצעות android:focusable="true"
ו-android:focusableInTouchMode="true".
אם התצוגה הניתנת לגלילה מצורפת אחרי Activity.onCreate() – למשך
לדוגמה, להמתין לסיום בקשת רשת לפני שבונים את ממשק המשתמש,
requestFocus() לאחר צירוף הקובץ.
אם הערך ההתחלתי של תצוגת הגלילה הוא INVISIBLE
או GONE,
קוראים לפונקציה requestFocus() כשמוגדרת
VISIBLE
אם הפעילות כוללת כמה תצוגות שניתן לגלול, אפשר לבחור אחת מהן להתמקד באמצעות
<requestFocus />
התיוג. אין תמיכה בגלילה בתוך רכיב באמצעות הלחצן המסתובב בצד.
אם ממשק המשתמש מכיל תצוגה אחרת שמתמקדת במשתמש
מקיים אינטראקציה איתו - לדוגמה,
InputText, אפשר למשתמש להחזיר את המיקוד לתצוגה שניתן לגלול
אם המכשיר מאבד את המיקוד על ידי האזנה להקשות בתצוגה הנגללת והתקשרות
requestFocus() בתגובה.
התנהגות משתנה מותאמת אישית
אם התצוגה הניתנת לגלילה לא תומכת במקור בגלילה סיבובית של קלט, או אם אתם רוצים
להשתמש בחוגה לקלט הנתונים שאינו גלילה - למשל
להגדיל ולהקטין את התצוגה או כדי לסובב חוגות — אפשר לטפל באירועי הגלילה
בעצמך. חשוב לוודא שהתצוגה תתמקד, אחרת
האירועים לא יתקיימו.
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;}});
בדיקה באמצעות אמולטור
שימוש באמולטור Android כדי לדמות חוגה לקלט הנתונים
גלילה במכשיר Wear. צריך להפעיל את אפליקציית Wear באמולטור כדי להריץ את האפליקציה
את הפרויקט או לגרור
את קובץ ה-APK לאמולטור כדי להתקין אותו.
כדי לבדוק את החוגה לקלט הנתונים באמולטור:
במנהל ה-SDK, נכנסים לכרטיסייה כלי SDK כדי:
אתם צריכים להתקין את Android Emulator בגרסה 26.0.3 ואילך.
ב-Android Studio, בוחרים באפשרות כלים >
Android > AVD Manager.
יוצרים מכשיר Wear חדש עם API 25 או
גבוהה יותר.
לוחצים על תפריט האפשרויות הנוספות של שלוש הנקודות בחלק התחתון של סרגל הכלים של האמולטור. לוחצים על
חוגה לקלט הנתונים בחלון החדש כדי לפתוח את חוגה לקלט הנתונים ולנסות לבצע חוגה
גלילה.
בסרטון הבא מוצג חוגה לקלט הנתונים באמולטור:
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-26 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 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:"]]