簡単にソースコードを知りたい人向け。
コンテキストメニューを作る場合には動的に生成する方法とレイアウトファイルを作る方法があるが、今回はレイアウトファイルから作る方法。レイアウトファイルでメニューを作る場合はAndroidStudioの機能を使って作るといろいろ設定してくれるので便利。やり方はこちらを参照。
今回は以下のようなレイアウトを作成した。
それぞれコンテキストが作成されるタイミングと、アイテムをタップされたときに呼ばれるので、それぞれ処理をしてあげればいい。
コンテキストメニューを作る場合には動的に生成する方法とレイアウトファイルを作る方法があるが、今回はレイアウトファイルから作る方法。レイアウトファイルでメニューを作る場合はAndroidStudioの機能を使って作るといろいろ設定してくれるので便利。やり方はこちらを参照。
今回は以下のようなレイアウトを作成した。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/itm01"
android:title="Item" />
<item
android:id="@+id/itm02"
android:title="Item" />
<item
android:id="@+id/itm03"
android:title="Item" ></item>
</menu>
まずは特定のビューに対してコンテキストメニューを表示させるビューだとして登録する。Viewを継承するものならば何でも登録できるらしい。UI部品はすべてViewを継承するので、事実上どのようなものでも登録できる。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//今回はtextViewを登録
registerForContextMenu(tvTest)
}
次にonCreateContextMenuとonContextItemSelectedをオーバーライドしたメソッドを作成する。もともとアクティビティクラスにあるものなのでインターフェースなどを継承する必要はない。それぞれコンテキストが作成されるタイミングと、アイテムをタップされたときに呼ばれるので、それぞれ処理をしてあげればいい。
//コンテキストメニューが作成されるときに発生するイベント
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
//コンテキストメニューとして作成したレイアウトファイルを登録する
menuInflater.inflate(R.menu.main, menu)
super.onCreateContextMenu(menu, v, menuInfo)
}
//コンテキストメニューのitemがタップされたときに発生するイベント
override fun onContextItemSelected(item: MenuItem?): Boolean {
//itemにタップされたアイテムが入っているのでitemidで区別して処理を分ける
when (item?.itemId) {
R.id.itm01 -> {
Log.v("nullpo", "1")
}
R.id.itm02 -> {
Log.v("nullpo", "2")
}
R.id.itm03 -> {
Log.v("nullpo", "3")
}
}
return super.onContextItemSelected(item)
}