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>
これでメニューを選んだ時、サブメニューが出るようになりました。