Menggunakan tampilan tindakan dan penyedia tindakan

Toolbar support library v7 appcompat menyediakan beberapa cara berbeda bagi pengguna untuk berinteraksi dengan aplikasi Anda. Tutorial sebelumnya menjelaskan cara menentukan tindakan, yang dapat berupa item tombol atau menu. Tutorial 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 item tombol atau menu, tetapi ketika pengguna mengklik tindakan, penyedia tindakan akan mengontrol perilaku tindakan dengan cara apa pun yang ingin Anda tetapkan. Misalnya, penyedia tindakan mungkin merespons klik dengan menampilkan menu.

Android support library menyediakan beberapa tampilan tindakan khusus dan widget penyedia tindakan. Misalnya, widget SearchView menerapkan tampilan tindakan untuk memasukkan kueri penelusuran, dan widget ShareActionProvider menerapkan 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 Tombol Tindakan. Tambahkan salah satu dari dua atribut berikut ke elemen <item>:

  • actionViewClass: Class widget yang menerapkan tindakan.
  • actionLayout: Resource tata letak yang menjelaskan komponen tindakan.

Setel atribut showAsAction ke "ifRoom|collapseActionView" atau "never|collapseActionView". Tanda collapseActionView menunjukkan cara menampilkan widget saat pengguna tidak berinteraksi dengannya: Jika widget ada di panel aplikasi, aplikasi tersebut harus menampilkan widget sebagai ikon. Jika widget ada di menu tambahan, aplikasi tersebut harus 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="android.support.v7.widget.SearchView" />
    

Jika pengguna tidak berinteraksi dengan widget, aplikasi akan menampilkan widget sebagai ikon yang ditentukan oleh android:icon. (Jika tidak ada cukup ruang di panel aplikasi, aplikasi tersebut akan menambahkan tindakan ke menu tambahan.) Ketika pengguna mengetuk ikon atau item menu, widget akan diperluas untuk mengisi toolbar, sehingga memungkinkan pengguna untuk berinteraksi dengannya.

Gambar 1. Saat pengguna mengklik ikon tampilan tindakan, UI tampilan akan mengisi toolbar.

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 bertanda collapseActionView, aplikasi akan menampilkan tampilan tindakan sebagai ikon hingga pengguna berinteraksi dengan tampilan tindakan. Saat pengguna mengklik ikon, pengendali bawaan untuk onOptionsItemSelected() akan memperluas tampilan tindakan. Jika subclass aktivitas Anda mengganti metode onOptionsItemSelected(), metode pengganti Anda harus memanggil super.onOptionsItemSelected() sehingga superclass dapat memperluas tampilan tindakan.

Jika Anda ingin melakukan sesuatu saat tindakan diperluas atau diciutkan, Anda dapat mendefinisikan class yang menerapkan MenuItem.OnActionExpandListener, lalu teruskan anggota class tersebut ke setOnActionExpandListener(). Misalnya, Anda mungkin ingin mengupdate aktivitas berdasarkan apakah tampilan tindakan diperluas atau diciutkan. Cuplikan berikut menunjukkan cara mendefinisikan 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 action item collapses
                return true // Return true to collapse action view
            }

            override fun onMenuItemActionExpand(item: MenuItem): Boolean {
                // Do something when expanded
                return true // Return true to expand 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)

        // Any other things you have to do when creating the options menu...

        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 action item collapses
                return true;  // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                // Do something when expanded
                return true;  // Return true to expand 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);

        // Any other things you have to do when creating the options menu...

        return true;
    }
    

Menambahkan Penyedia Tindakan

Untuk mendeklarasikan penyedia tindakan, buat elemen <item> di resource menu toolbar, seperti yang dijelaskan dalam Menambahkan Tombol Tindakan. Tambahkan atribut actionProviderClass, dan setel ke nama class yang memenuhi syarat lengkap untuk class penyedia tindakan.

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

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

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

Untuk informasi tentang pembuatan penyedia tindakan kustom, lihat referensi ActionProvider. Untuk informasi tentang konfigurasi ShareActionProvider, lihat referensi untuk class tersebut.