ผู้ใช้สามารถออกจากกิจกรรม 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
และคุณจะขัดจังหวะเหตุการณ์สําคัญไม่ได้
ดูข้อมูลเพิ่มเติมได้ที่การนําทาง