Keluar dari aktivitas layar penuh di Wear

Pengguna dapat keluar dari aktivitas Wear OS dengan menggeser dari kiri ke kanan. Jika aplikasi memiliki scrolling horizontal (misalnya, jenis scrolling yang tersedia di aplikasi yang berisi peta), pengguna akan keluar dengan menavigasi ke tepi konten, lalu menggeser dari kiri ke kanan.

Menekan tombol daya akan mengembalikan pengguna ke tampilan jam.

Lihat referensi terkait berikut:

Gestur geser untuk menutup

Pengguna menggeser dari kiri ke kanan untuk menutup layar saat ini. Oleh karena itu, direkomendasikan agar Anda menggunakan hal berikut:

Direkomendasikan juga agar aplikasi Anda tidak berisi gestur geser horizontal.

Penutupan aktivitas

Aktivitas secara otomatis mendukung geser untuk menutup. Menggeser aktivitas dari kiri ke kanan akan menutup aktivitas, dan aplikasi akan menuju ke back-stack.

Fragmen

Anda dapat menggabungkan tampilan berisi fragmen ke dalam class SwipeDismissFrameLayout seperti berikut:

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

Catatan: Class SwipeDismissFrameLayout menggantikan class serupa yang tidak digunakan lagi di Support Library Wearable.

Tampilan yang dapat di-scroll secara horizontal

Pada beberapa kondisi, seperti dalam tampilan berisi peta yang mendukung penggeseran, antarmuka pengguna tidak akan mencegah penggeseran horizontal. Dalam skenario ini, terdapat dua pilihan:

  • Jika back-stack pendek, pengguna dapat menutup aplikasi dan kembali ke layar utama (tampilan jam) dengan menekan tombol daya.
  • Jika ingin pengguna menelusuri data sebelumnya, Anda dapat menggabungkan tampilan dalam objek SwipeDismissFrameLayout, yang mendukung geser tepi. Geser tepi diaktifkan saat tampilan atau turunannya menghasilkan true dari a panggilan canScrollHorizontally(). Geser tepi memungkinkan pengguna menutup tampilan dengan menggeser dari sisi paling kiri layar (saat ini disetel ke 10% lebar layar) dan bukan di mana pun dalam tampilan.

Untuk menggabungkan tampilan dalam objek SwipeDismissFrameLayoutSwipeDismissFrameLayout, tinjau contoh berikut:

XML untuk file tata letak

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

Cuplikan kode

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

Umumnya tidak direkomendasikan: Menonaktifkan geser untuk menutup

Menonaktifkan geser untuk menutup umumnya tidak direkomendasikan karena pengguna menginginkan menutup setiap layar dengan sekali geser. Dalam kasus khusus, Anda dapat memperluas tema default (di resource gaya) dan menetapkan atribut android:windowSwipeToDismiss ke false:

    <resources>
      <style name="AppTheme" parent="@android:style/Theme.DeviceDefault">
        <item name="android:windowSwipeToDismiss">false</item>
      </style>
    </resources>
    

Anda kemudian dapat memberi tahu pengguna (ketika pertama kali menggunakan aplikasi Anda) bahwa mereka dapat keluar dari aplikasi dengan menekan tombol daya.

Perilaku penutupan sebelum Wear 2.0

Sebelum Wear 2.0, class DismissOverlayView digunakan untuk mengimplementasikan tekan lama bagi pengguna untuk menutup aplikasi. Class DismissOverlayView seharusnya tidak digunakan lagi.

Selain itu, tekan lama untuk menutup aplikasi tidak lagi disarankan. Jangan mengimplementasikan tekan lama untuk menutup aktivitas layar penuh (penggeseran atau aktivitas imersif seperti Google Maps).

Penutupan melalui tombol power

Menekan tombol power (tombol fisik) akan mengirimkan peristiwa tombol power. Oleh karena itu, Anda tidak dapat menggunakan tombol power sebagai tombol kembali atau navigasi secara umum.

Ketika ditekan, tombol power akan mengembalikan pengguna ke layar utama (tampilan jam). Ada dua pengecualian:

  • Jika pengguna adalah IME (Editor Metode Masukan, misalnya, layar pengenalan tulisan), menekan tombol tersebut akan menutup IME dan mengembalikan pengguna ke aplikasi.
  • Jika pengguna berada pada tampilan jam, menekan tombol fisik akan membuka peluncur aplikasi.

Perhatikan bahwa saat tombol daya ditekan, metode isFinishing() dari class Activity tidak menampilkan true (Anda juga tidak dapat menghalangi peristiwa kunci).