Keluar dari aktivitas layar penuh di Wear

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

Menekan tombol power akan mengembalikan pengguna ke tampilan jam.

Lihat resource 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:

Juga direkomendasikan 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 android.support.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 android.support.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 sudah tidak digunakan lagi dalam Wearable Support Library.

Tampilan yang dapat di-scroll 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 power.
  • Jika Anda ingin pengguna menuju back-stack, Anda dapat menggabungkan tampilan dalam objek SwipeDismissFrameLayout, yang mendukung geser tepi. Geser tepi diaktifkan ketika tampilan atau turunannya mengembalikan nilai true dari 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 SwipeDismissFrameLayout, tinjau contoh berikut:

XML untuk file tata letak

    <android.support.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." />
    </android.support.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 berharap menutup setiap layar dengan satu geseran. Pada kasus yang tidak umum terjadi, Anda dapat memperluas tema default (dalam resource ) dan menyetel 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 power.

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.

Perlu diperhatikan bahwa ketika tombol power ditekan, metode isFinishing() dari class Activity tidak akan mengembalikan nilai true (Anda pun tidak dapat membatalkan peristiwa tombol).