Menggunakan tampilan tindakan dan penyedia tindakan

Toolbar library AndroidX menyediakan cara yang berbeda bagi pengguna untuk berinteraksi dengan aplikasi Anda. Menambahkan dan menangani tindakan menjelaskan cara menentukan tindakan, yang dapat berupa tombol atau item menu. Dokumen ini menjelaskan cara menambahkan dua komponen serbaguna:

  • Tampilan tindakan adalah tindakan yang menyediakan beragam fungsi di dalam panel aplikasi. Misalnya, tampilan tindakan penelusuran memungkinkan pengguna mengetik teks penelusuran di panel aplikasi tanpa harus mengubah aktivitas atau fragmen.
  • Penyedia tindakan adalah tindakan dengan tata letak yang disesuaikan sendiri. Tindakan ini awalnya muncul sebagai tombol atau item menu; saat pengguna mengetuk tindakan, penyedia tindakan akan mengontrol perilaku tindakan sesuai keinginan Anda. Misalnya, penyedia tindakan mungkin merespons ketukan dengan menampilkan menu.

AndroidX menyediakan beberapa widget penyedia tindakan dan tampilan tindakan khusus. Misalnya, widget SearchView mengimplementasikan tampilan tindakan untuk memasukkan kueri penelusuran. Widget ShareActionProvider mengimplementasikan penyedia tindakan untuk berbagi informasi dengan aplikasi lain. Anda juga dapat menentukan tampilan tindakan dan penyedia tindakan Anda sendiri.

Menambahkan tampilan tindakan

Untuk menambahkan tampilan tindakan, buat elemen <item> di resource menu toolbar, seperti yang dijelaskan dalam Menambahkan dan menangani tindakan. Tambahkan salah satu atribut berikut ke elemen <item>:

  • actionViewClass: class widget yang menerapkan tindakan
  • actionLayout: resource tata letak yang menjelaskan komponen tindakan

Tetapkan atribut showAsAction ke "ifRoom|collapseActionView" atau "never|collapseActionView". Flag collapseActionView menunjukkan cara menampilkan widget saat pengguna tidak berinteraksi dengannya. Jika widget ada di panel aplikasi, aplikasi akan menampilkan widget sebagai ikon. Jika widget berada di menu tambahan, aplikasi akan menampilkan widget sebagai item menu. Saat pengguna berinteraksi dengan tampilan tindakan, tampilan akan diperluas untuk mengisi panel aplikasi.

Misalnya, kode berikut menambahkan widget SearchView ke panel aplikasi:

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

Jika pengguna tidak berinteraksi dengan widget, aplikasi akan menampilkan widget sebagai ikon yang ditentukan oleh android:icon. Jika tidak ada ruang di panel aplikasi, aplikasi akan menambahkan tindakan ke menu tambahan.

Gambar yang menampilkan kotak penelusuran dengan ikon di awal dan di akhir.
Gambar 1. Kotak penelusuran dengan ikon di depan dan di belakang.

Saat pengguna mengetuk ikon atau item menu, widget akan diperluas untuk mengisi toolbar, sehingga pengguna dapat berinteraksi dengan widget.

Gambar yang menunjukkan tampilan penelusuran yang terbuka setelah kotak penelusuran difokuskan.
Gambar 2. Tampilan penelusuran terbuka setelah kotak penelusuran difokuskan.

Jika Anda perlu mengonfigurasi tindakan, lakukan di callback onCreateOptionsMenu() aktivitas Anda. Anda bisa mendapatkan referensi objek tampilan tindakan dengan memanggil metode getActionView(). Misalnya, kode berikut mendapatkan referensi objek untuk widget SearchView yang ditentukan dalam contoh kode sebelumnya:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_activity_actions, menu)

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

Merespons perluasan tampilan tindakan

Jika elemen <item> tindakan memiliki flag collapseActionView, aplikasi akan menampilkan tampilan tindakan sebagai ikon hingga pengguna berinteraksi dengan tampilan tindakan. Saat pengguna mengetuk ikon, pengendali bawaan untuk onOptionsItemSelected() akan memperluas tampilan tindakan. Jika subclass aktivitas Anda mengganti metode onOptionsItemSelected(), metode penggantian Anda harus memanggil super.onOptionsItemSelected() agar superclass dapat memperluas tampilan tindakan.

Jika ingin melakukan sesuatu saat tindakan diperluas atau diciutkan, Anda dapat menentukan class yang mengimplementasikan MenuItem.OnActionExpandListener, dan meneruskan anggota class tersebut ke setOnActionExpandListener(). Misalnya, Anda mungkin ingin memperbarui aktivitas berdasarkan apakah tampilan tindakan diperluas atau diciutkan. Cuplikan kode berikut menunjukkan cara menetapkan dan meneruskan pemroses:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.options, menu)

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

Menambahkan penyedia tindakan

Untuk mendeklarasikan penyedia tindakan, buat elemen <item> di resource menu toolbar, seperti yang dijelaskan dalam Menambahkan dan menangani tindakan. Tambahkan atribut actionProviderClass, lalu tetapkan ke nama class yang sepenuhnya memenuhi syarat untuk class penyedia tindakan.

Misalnya, kode berikut mendeklarasikan ShareActionProvider, yang merupakan widget yang ditentukan dalam library AndroidX yang memungkinkan aplikasi Anda berbagi data dengan aplikasi lain:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

Dalam hal ini, Anda tidak perlu mendeklarasikan ikon untuk widget, karena ShareActionProvider menyediakan grafisnya sendiri. Jika Anda menggunakan tindakan kustom, deklarasikan ikon.

Referensi lainnya

  • Lihat ShareActionProvider untuk contoh menambahkan tindakan berbagi ke panel aplikasi atas Anda.
  • Lihat ActionProvider untuk informasi selengkapnya tentang membuat penyedia tindakan kustom.