しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

ActionProviderでサブメニューを表示する

ActionProviderというクラスを使ってAndroidアプリのメニューにサブメニューを入れてみました。

Activityでメニューを表示して動かするためには下のようなメソッドを実装します。

class MainActivity : AppCompatActivity() {
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}

onCreateOptionsMenuで呼び出しているmenu_main.xmlは下のようになっています。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.myapplication.MainActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never" />
</menu>

アプリを起動すると右上にメニュー(…表示)が出ます。
ここをタップするとmenu_main.xmlの内容が表示されます。

今回はActionProviderを使ってメニューのサブメニュー部分を作ってみました。
まずはサブメニュー用にmenu_test.xmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="Menu1" />
    <item android:title="Menu2" />
    <item android:title="Menu3" />
</menu>

次にActionProviderを継承したクラスを作ります。
hasSubMenuとonPrepareSubMenuでサブメニューの設定をしています。
onPerformDefaultActionはonOptionsItemSelectedが実装されていない時に呼ばれるメソッドです。

class MyActionProvider(private val context: Context): ActionProvider(context) {
    override fun onCreateActionView(): View {
        return View(context)
    }

    override fun onPerformDefaultAction(): Boolean {
        Log.e("Test", "test")
        return super.onPerformDefaultAction()
    }

    override fun hasSubMenu(): Boolean {
        return true
    }

    override fun onPrepareSubMenu(subMenu: SubMenu) {
        subMenu.clear()
        MenuInflater(context).inflate(R.menu.menu_test, subMenu)
    }
}

最後にmenu_main.xmlでactionProviderClassを使ってActionProviderを設定します。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.myapplication.MainActivity">
    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:actionProviderClass="com.example.myapplication.MyActionProvider" />
</menu>

これでメニューを選んだ時、サブメニューが出るようになりました。