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, pengguna akan keluar dengan menavigasi ke tepi konten, lalu menggeser dari kiri ke kanan. Menekan tombol daya juga akan mengembalikan pengguna ke tampilan jam.

Gestur geser untuk menutup

Pengguna menggeser dari kiri ke kanan untuk menutup layar saat ini. Oleh karena itu, sebaiknya gunakan kode berikut:

  • Tata letak vertikal
  • Penampung konten

Sebaiknya aplikasi Anda juga tidak berisi gestur geser horizontal.

Menutup aktivitas

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

Menutup fragmen

Untuk mendukung geser-untuk-menutup dalam fragmen, Anda harus menggabungkan tampilan yang berisi fragmen dalam class SwipeDismissFrameLayout. Pertimbangkan hal ini saat memutuskan apakah akan menggunakan fragmen. Gunakan class SwipeDismissFrameLayout seperti ditunjukkan dalam contoh 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: Saat menggunakan fragmen dalam aktivitas, gunakan FragmentManager.add , bukan FragmentManager.replace untuk mendukung gestur geser-untuk-menutup. Hal ini membantu memastikan bahwa fragmen Anda yang sebelumnya dirender di bawah fragmen atas saat fragmen digeser.

Tampilan yang dapat di-scroll horizontal

Dalam beberapa kasus, seperti dalam tampilan berisi peta yang mendukung penggeseran, antarmuka pengguna tidak dapat mencegah penggeseran horizontal. Dalam skenario ini, ada dua pilihan:

  • Jika data sebelumnya 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 menampilkan true dari panggilan canScrollHorizontally(). Geser tepi memungkinkan pengguna menutup tampilan dengan menggeser dari 10% layar paling kiri, bukan di mana pun dalam tampilan.

Contoh berikut menunjukkan cara menggabungkan tampilan dalam objek 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);
    }
  }
);

Tidak direkomendasikan: Menonaktifkan geser untuk menutup

Secara umum, kami tidak merekomendasikan penonaktifan geser-untuk-menutup, karena pengguna berharap menutup semua layar dengan sekali geser. Pada kasus yang tidak umum terjadi, Anda dapat memperluas tema default di resource gaya dan menetapkan atribut android:windowSwipeToDismiss ke false, seperti ditunjukkan dalam contoh kode berikut:

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

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

Menutup dengan tombol daya

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

Saat ditekan, tombol daya akan mengembalikan pengguna ke layar utama tampilan jam. Ada dua pengecualian:

  • Jika pengguna berada dalam Editor Metode Input (IME), seperti layar pengenalan tulis tangan, menekan tombol akan menutup IME dan mengembalikan pengguna ke aplikasi.
  • Jika pengguna berada pada tampilan jam, menekan tombol hardware akan membuka peluncur aplikasi.

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

Untuk informasi selengkapnya, lihat Navigasi.