الخروج من الأنشطة بملء الشاشة على Wear

تجربة ميزة "الكتابة"
إنّ Jetpack Compose على Wear OS هو مجموعة الأدوات المقترَحة لواجهة المستخدم في Wear OS.

يمكن للمستخدم الخروج من نشاط على Wear OS من خلال التمرير سريعًا من اليسار إلى اليمين. إذا كان التطبيق يتيح الانتقال الأفقي، يمكن للمستخدم الخروج من خلال الانتقال إلى حافة المحتوى ثم التمرير سريعًا من اليسار إلى اليمين. يؤدي الضغط على زر التشغيل أيضًا إلى إعادة المستخدم إلى خلفية شاشة الساعة.

إيماءة التمرير السريع لإغلاق الإشعار

يمرر المستخدمون سريعًا من اليسار إلى اليمين لإغلاق الشاشة الحالية. لذلك، ننصحك باستخدام ما يلي:

  • التنسيقات العمودية
  • حاويات المحتوى

وننصحك أيضًا بعدم تضمين إيماءات التمرير السريع الأفقي في تطبيقك.

إغلاق نشاط

تتيح الأنشطة تلقائيًا التمرير سريعًا لإغلاقها. يؤدي التمرير سريعًا على نشاط من اليسار إلى اليمين إلى إغلاق النشاط، وينتقل التطبيق إلى أسفل حزمة التطبيقات التي تم استخدامها مؤخرًا.

إغلاق جزء

لإتاحة ميزة التمرير سريعًا لإغلاق الأجزاء، عليك لفّ العرض الذي يحتوي على الجزء في فئة 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 لتفعيل إيماءة التمرير السريع لإغلاق العنصر. يساعد ذلك في ضمان عرض المقتطف السابق أسفل المقتطف العلوي أثناء التمرير سريعًا عليه.

طرق العرض القابلة للتنقّل أفقيًا

في بعض الحالات، مثل العرض الذي يحتوي على خريطة تتيح التمرير، لا يمكن لواجهة المستخدم منع التمرير السريع أفقيًا. في هذا السيناريو، هناك خياران:

  • إذا كان تسلسل التطبيقات المُغلقة قصيرًا، يمكن للمستخدم إغلاق التطبيق والعودة إلى الشاشة الرئيسية لخلفية شاشة الساعة من خلال الضغط على زر التشغيل.
  • إذا أردت أن ينتقل المستخدم إلى أسفل الحزمة الخلفية، يمكنك لف العرض في عنصر 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)، مثل شاشة التعرّف على الكتابة اليدوية، يؤدي الضغط على الزر إلى إغلاق محرِّر أسلوب الإدخال وإرجاع المستخدم إلى التطبيق.
  • إذا كان المستخدم في خلفية شاشة الساعة، يؤدي الضغط على الزر في الجهاز إلى فتح مشغِّل التطبيقات.

ملاحظة: عند الضغط على زر التشغيل، لا تُعرِض isFinishing() من فئة Activitytrue، ولا يمكنك اعتراض الحدث الرئيسي.

لمزيد من المعلومات، يُرجى الاطّلاع على التنقّل.