יציאה מפעילויות במסך מלא ב-Wear

אפשר לנסות את הדרך של כתיבת הודעה
‫Jetpack Compose ב-Wear OS הוא ערכת הכלים המומלצת ליצירת ממשקי משתמש ל-Wear OS.

משתמש יכול לצאת מפעילות ב-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, ואי אפשר ליירט את אירוע המקש.

מידע נוסף זמין במאמר בנושא ניווט.