خروج از فعالیت‌های تمام‌صفحه در Wear

امتحان کردن روش Compose
Jetpack Compose در Wear OS جعبه‌ابزار واسط کاربر توصیه‌شده برای Wear OS است.

کاربر می‌تواند با تند کشیدن از چپ به راست، از فعالیت Wear OS خارج شود. اگر برنامه پیمایش افقی داشته باشد، کاربر با پیمایش به لبه محتوا و سپس تند کشیدن از چپ به راست خارج می‌شود. فشار دادن دکمه روشن/خاموش نیز کاربر را به صفحه ساعت برمی‌گرداند.

اشاره تند کشیدن برای رد کردن

کاربران برای بستن صفحه فعلی، انگشتشان را از چپ به راست تند می‌کشند. بنابراین، توصیه می‌کنیم از موارد زیر استفاده کنید:

  • چیدمان‌های عمودی
  • محفظه‌های محتوا

همچنین توصیه می‌کنیم که برنامه‌تان حاوی اشاره‌های تند کشیدن افقی نباشد.

بستن فعالیت

فعالیت‌ها به‌طور خودکار از تند کشیدن برای بستن پشتیبانی می‌کنند. با تند کشیدن فعالیت از چپ به راست، فعالیت بسته می‌شود و برنامه در پشته قبلی‌ها به پایین پیمایش می‌کند.

بستن بخش

برای پشتیبانی از تند کشیدن برای رد کردن در قطعه‌ها، باید نمای حاوی قطعه را در کلاس SwipeDismissFrameLayout قرار دهید. هنگام تصمیم‌گیری درباره استفاده از قطعه‌ها، این موضوع را درنظر بگیرید. از کلاس SwipeDismissFrameLayout همان‌طور که در مثال زیر نشان داده شده است استفاده کنید:

کاتلین

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)
            }
}

جاوا

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() برمی‌گرداند، تند کشیدن از لبه فعال می‌شود. تند کشیدن از لبه به کاربر امکان می‌دهد به‌جای تند کشیدن از هرجای نما، با تند کشیدن از ۱۰٪ سمت چپ صفحه، نما را ببندد.

مثال‌های زیر نحوه پیچیدن نما در شیء 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>

کاتلین

activity?.findViewById<SwipeDismissFrameLayout>(R.id.swipe_dismiss_root)?.apply {
    addCallback(object : SwipeDismissFrameLayout.Callback() {

        override fun onDismissed(layout: SwipeDismissFrameLayout) {
            layout.visibility = View.GONE
        }
    })
}

جاوا

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 را برنمی‌گرداند و نمی‌توانید رویداد کلید را رهگیری کنید.

برای اطلاعات بیشتر، به ناوبری مراجعه کنید.