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

روش نوشتن را امتحان کنید
Jetpack Compose روی Wear OS، ابزار رابط کاربری پیشنهادی برای Wear OS است.

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

ژست کشیدن برای رد کردن

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

  • طرح بندی های عمودی
  • ظروف محتوا

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

رد کردن یک فعالیت

فعالیت‌ها به‌طور خودکار از قابلیت کشیدن انگشت برای رد کردن پشتیبانی می‌کنند. کشیدن انگشت روی یک فعالیت از چپ به راست منجر به رد کردن آن فعالیت می‌شود و برنامه به پشته (back stack) می‌رود.

رد کردن یک قطعه

برای پشتیبانی از قابلیت کشیدن انگشت برای رد کردن در فرگمنت‌ها، باید نمای حاوی فرگمنت را در کلاس 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;
    }
}

نکته: وقتی از fragmentها در activity خود استفاده می‌کنید، برای پشتیبانی از حرکت swipe-to-dismiss از FragmentManager.add به جای FragmentManager.replace استفاده کنید. این کار به شما کمک می‌کند تا fragment قبلی شما در زیر fragment بالایی رندر شود، در حالی که fragment قبلی با swipe کردن از بین می‌رود.

نماهای افقی قابل اسکرول

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

  • اگر پشته ساعت کوتاه باشد، کاربر می‌تواند با فشار دادن دکمه پاور، برنامه را ببندد و به صفحه اصلی ساعت بازگردد.
  • اگر می‌خواهید کاربر به پشته (back stack) برود، می‌توانید نما را در یک شیء SwipeDismissFrameLayout قرار دهید که از کشیدن لبه پشتیبانی می‌کند. کشیدن لبه زمانی فعال می‌شود که نما یا فرزندانش از فراخوانی canScrollHorizontally() true را برگردانند. کشیدن لبه به کاربر اجازه می‌دهد تا با کشیدن از 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>

کاتلین

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

توصیه نمی‌شود: غیرفعال کردن قابلیت رد کردن با کشیدن انگشت

ما معمولاً غیرفعال کردن قابلیت swipe-to-dismiss را توصیه نمی‌کنیم، زیرا کاربر انتظار دارد هر صفحه‌ای را با کشیدن انگشت ببندد. در یک مورد استثنایی، می‌توانید تم پیش‌فرض را در یک منبع style گسترش دهید و ویژگی 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 برنمی‌گرداند و شما نمی‌توانید رویداد کلید را رهگیری کنید.

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