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

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

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

لمزيد من المعلومات، راجع التنقل.