משתמש יכול לצאת מפעילות ב-Wear OS בהחלקה מימין לשמאל. אם באפליקציה יש גלילה אופקית, המשתמש יוצא ממנה על ידי ניווט לקצה התוכן ואז החלקה משמאל לימין. לחיצה על לחצן ההפעלה מחזירה את המשתמש לתצוגת השעון.
תנועת ההחלקה לסגירה
המשתמשים מחליקים משמאל לימין כדי לסגור את המסך הנוכחי. לכן, אנחנו ממליצים להשתמש באפשרויות הבאות:
- פריסות אנכיות
- קונטיינרים של תוכן
מומלץ גם שהאפליקציה לא תכלול מחוות החלקה אופקיות.
איך מסיימים פעילויות
הפעילויות תומכות אוטומטית בהחלקה כדי לסגור. החלקה של פעילות משמאל לימין גורמת לסגירת הפעילות, והאפליקציה עוברת ל מקבץ הפעילויות הקודמות (back stack).
איך סוגרים מקטע
כדי לתמוך בהחלקה לסגירה בקטעים, צריך להוסיף את התצוגה שמכילה את הקטע למחלקה
SwipeDismissFrameLayout. חשוב לקחת את זה בחשבון כשמחליטים אם להשתמש בקטעים. משתמשים במחלקה SwipeDismissFrameLayout כמו בדוגמה הבאה:
Kotlin
class SwipeDismissFragment : Fragment() { private val callback = object : SwipeDismissFrameLayout.Callback() { override fun onSwipeStarted(layout: SwipeDismissFrameLayout) { // Optional } override fun onSwipeCanceled(layout: SwipeDismissFrameLayout) { // Optional } override fun onDismissed(layout: SwipeDismissFrameLayout) { // Code here for custom behavior, such as going up the // back stack and destroying the fragment but staying in the app. } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View = SwipeDismissFrameLayout(activity).apply { // If the fragment should fill the screen (optional), then in the layout file, // in the androidx.wear.widget.SwipeDismissFrameLayout element, // set the android:layout_width and android:layout_height attributes // to "match_parent". inflater.inflate( R.layout.swipe_dismiss_frame_layout, this, false ).also { inflatedView -> addView(inflatedView) } addCallback(callback) } }
Java
public class SwipeDismissFragment extends Fragment { private final Callback callback = new Callback() { @Override public void onSwipeStart() { // Optional } @Override public void onSwipeCancelled() { // Optional } @Override public void onDismissed(SwipeDismissFrameLayout layout) { // Code here for custom behavior, such as going up the // back stack and destroying the fragment but staying in the app. } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { SwipeDismissFrameLayout swipeLayout = new SwipeDismissFrameLayout(getActivity()); // If the fragment should fill the screen (optional), then in the layout file, // in the androidx.wear.widget.SwipeDismissFrameLayout element, // set the android:layout_width and android:layout_height attributes // to "match_parent". View inflatedView = inflater.inflate(R.layout.swipe_dismiss_frame_layout, swipeLayout, false); swipeLayout.addView(inflatedView); swipeLayout.addCallback(callback); return swipeLayout; } }
הערה: כשמשתמשים בפרגמנטים בפעילות, צריך להשתמש ב-FragmentManager.add ולא ב-FragmentManager.replace כדי לתמוך בתנועת ההחלקה לסגירה.
כך אפשר לוודא שהקטע הקודם יוצג מתחת לקטע העליון בזמן שמחליקים אותו הצידה.
תצוגות שאפשר לגלול בהן אופקית
במקרים מסוימים, למשל בתצוגה שמכילה מפה עם תמיכה בהזזה, ממשק המשתמש לא יכול למנוע החלקה אופקית. במקרה כזה, יש שתי אפשרויות:
- אם מקבץ פעילויות קודמות (back stack) קצר, המשתמש יכול לסגור את האפליקציה ולחזור למסך הבית של תצוגת השעון על ידי לחיצה על כפתור ההפעלה.
- אם רוצים שהמשתמש יחזור אחורה במקבץ הפעילויות הקודמות (back stack), אפשר להוסיף את התצוגה לאובייקט
SwipeDismissFrameLayoutשתומך בהחלקה מהקצה. ההחלקה מהקצה מופעלת כשהתצוגה או הצאצאים שלה מחזיריםtrueמקריאהcanScrollHorizontally(). החלקה מהקצה מאפשרת למשתמש לסגור את התצוגה בהחלקה מ-10% השמאליים של המסך, ולא מכל מקום בתצוגה.
בדוגמאות הבאות אפשר לראות איך עוטפים תצוגה באובייקט SwipeDismissFrameLayout:
<androidx.wear.widget.SwipeDismissFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/swipe_dismiss_root" > <TextView android:id="@+id/test_content" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="Swipe me to dismiss me." /> </androidx.wear.widget.SwipeDismissFrameLayout>
Kotlin
activity?.findViewById<SwipeDismissFrameLayout>(R.id.swipe_dismiss_root)?.apply { addCallback(object : SwipeDismissFrameLayout.Callback() { override fun onDismissed(layout: SwipeDismissFrameLayout) { layout.visibility = View.GONE } }) }
Java
SwipeDismissFrameLayout testLayout = (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root); testLayout.addCallback(new SwipeDismissFrameLayout.Callback() { @Override public void onDismissed(SwipeDismissFrameLayout layout) { layout.setVisibility(View.GONE); } } );
לא מומלץ: השבתת האפשרות לדחיית התראות בהחלקה
באופן כללי, אנחנו לא ממליצים להשבית את האפשרות לסגור את המסך בהחלקה, כי המשתמשים מצפים לסגור כל מסך בהחלקה. במקרים חריגים, אפשר להרחיב את ברירת המחדל של ערכת הנושא ב
משאב סגנון ולהגדיר את המאפיין android:windowSwipeToDismiss לערך false, כמו בדוגמת הקוד הבאה:
<resources> <style name="AppTheme" parent="@android:style/Theme.DeviceDefault"> <item name="android:windowSwipeToDismiss">false</item> </style> </resources>
אחר כך תוכלו להודיע למשתמשים בפעם הראשונה שהם משתמשים באפליקציה שלכם שהם יכולים לצאת מהאפליקציה בלחיצה על לחצן ההפעלה.
ביטול ההתראה באמצעות לחצן ההפעלה
לחיצה על לחצן ההפעלה הפיזי שולחת אירוע של מקש הפעלה. לכן, אי אפשר להשתמש בלחצן ההפעלה כלחצן 'הקודם' או לניווט באופן כללי.
כשלוחצים על לחצן ההפעלה, המשתמש חוזר למסך הבית של תצוגת השעון. קיימים שני יוצאים מן הכלל:
- אם המשתמש נמצא בעורך שיטות קלט (IME), כמו מסך לזיהוי כתב יד, לחיצה על הכפתור סוגרת את ה-IME ומחזירה את המשתמש לאפליקציה.
- אם המשתמש נמצא בתצוגת השעון, לחיצה על כפתור פיזי פותחת את מרכז האפליקציות.
הערה: כשלוחצים על לחצן ההפעלה, השיטה
isFinishing() של המחלקה Activity לא מחזירה true, ואי אפשר ליירט את אירוע המקש.
מידע נוסף זמין במאמר בנושא ניווט.