ออกจากกิจกรรมแบบเต็มหน้าจอใน Wear

ลองใช้วิธีเขียน
Jetpack Compose ใน Wear OS เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Wear OS

ผู้ใช้สามารถออกจากกิจกรรม Wear OS ได้โดยการปัดจากซ้ายไปขวา หากแอปมีการเลื่อนแนวนอน ผู้ใช้จะออกโดยไปยังขอบของเนื้อหาแล้วปัดจากซ้ายไปขวา การกดปุ่มเปิด/ปิดยังจะนำผู้ใช้กลับไปที่หน้าปัดด้วย

ท่าทางสัมผัสด้วยการปัดเพื่อปิด

ผู้ใช้ปัดจากซ้ายไปขวาเพื่อปิดหน้าจอปัจจุบัน เราจึงขอแนะนําให้คุณใช้สิ่งต่อไปนี้

  • เลย์เอาต์แนวตั้ง
  • คอนเทนเนอร์เนื้อหา

นอกจากนี้ เราขอแนะนําว่าแอปของคุณไม่ควรมีท่าทางสัมผัสด้วยการปัดแนวนอน

ปิดกิจกรรม

กิจกรรมรองรับการปัดเพื่อปิดโดยอัตโนมัติ การปัดกิจกรรมจากซ้ายไปขวาจะเป็นการปิดกิจกรรมนั้น และแอปจะไปยัง กองซ้อนที่ย้อนกลับ

ปิดการ์ด

หากต้องการรองรับการปัดเพื่อปิดในฟragment คุณต้องรวมมุมมองที่มีฟragment ไว้ในคลาส 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 เพื่อรองรับท่าทางสัมผัสปัดเพื่อปิด วิธีนี้ช่วยให้มั่นใจว่าข้อมูลโค้ดที่แสดงผลก่อนหน้าจะแสดงผลใต้ข้อมูลโค้ดที่แสดงผลด้านบนขณะที่ผู้ใช้ปัดออก

มุมมองที่เลื่อนได้ในแนวนอน

ในบางกรณี เช่น ในมุมมองที่มีแผนที่รองรับการเลื่อน อินเทอร์เฟซผู้ใช้จะป้องกันการปัดในแนวนอนไม่ได้ ในสถานการณ์นี้ คุณมี 2 ตัวเลือก ได้แก่

  • หากกองซ้อนย้อนกลับมีจำนวนน้อย ผู้ใช้จะปิดแอปและกลับไปที่หน้าจอหลักของหน้าปัดได้โดยกดปุ่มเปิด/ปิด
  • หากต้องการให้ผู้ใช้ไปยังกองซ้อนที่ซ้อนกันอยู่ด้านล่าง คุณสามารถรวมมุมมองไว้ในออบเจ็กต์ 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>

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 และคุณจะขัดจังหวะเหตุการณ์สําคัญไม่ได้

ดูข้อมูลเพิ่มเติมได้ที่การนําทาง