LoginSignup
1
0

More than 1 year has passed since last update.

【Kotlin研修4日目】コンテキストメニューの実装

Posted at

コンテキストメニュー

ListViewなどを長押しした際に表示される小さなポップアップメニュー。

コンテキストメニューの実装

参考: 研修4日目
コンテキストメニューを実装する手順は、以下の通り。

  1. resフォルダ内に、Resource Type: menuAndroid Resource Directoryを作成
  2. 1.で作成したフォルダ内に、Menu Resource File(.xmlファイル)を作成
  3. アクティビティクラスに、コンテキストメニューを生成するための
    onCreateContextMenu()メソッドを実装
  4. アクティビティクラスのonCreate()メソッド内に、生成したコンテキストメニューを表示するための
    registerForContextMenu()メソッドを記述
  5. コンテキストメニューItem選択時に呼び出されるonContextItemSelected()メソッドに、
    選択されたコンテキストメニューItemに応じた分岐処理を記述

Menu Resource Fileの記述

コンテキストメニューItem含むレイアウトを定義するXMLファイル。

Menu Resource File

参考: メニューリソース
アプリ内に実装する各種メニューのレイアウトを定義するXMLファイル。
メニューには、コンテキストメニューのほか、オプションメニューサブメニューが含まれる。

定義

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

    <item
        android:id="@+id/<ItemID>"
        android:title="@string/<strings.xmlで定義した文字列の変数名>"
    />
</menu>

コンテキストメニューの生成

参考: ContextMenu
コンテキストメニュー表示時に呼び出されるonCreateContextMenu()メソッドのブロック{...}内に、
コンテキストメニューItemを定義したXMLを表示するMenuInflater.inflate()メソッドを記述する。
また、コンテキストメニューヘッダタイトルを表示させる場合はContextMenu.setHeaderTitle()メソッドを記述する。

定義

MenuInflater.inflate(menuRes: Int, menu: Menu!): Unit
// パラメータ
// menuRes: メニューのレイアウトファイル名(R値)
// menu: インフレートを行うメニュー

ContextMenu?.setHeaderTitle(titleRes: Int)
// パラメータ
// titleRes: ヘッダタイトルの文字列ID(R値)

サンプルコード

MainActivity.kt
class MainActivity: AppCompatActivity() {
    // コンテキストメニュー表示時に呼び出される処理
    override fun onCreateContextMenu(
        menu: ContextMenu?, 
        view: View?, 
        menuInfo: ContextMenu.ContextMenuInfo?
    ) {
        super.onCreateContextMenu(menu, view, menuInfo)

        // コンテキストメニューのレイアウト(XML)のインフレート
        menuInflater.inflate(menuRes: Int, menu: Menu!): Unit

        // ヘッダタイトルの定義
        menu?.setHeaderTitle(titleRes: Int)
    }
}

ListViewへのコンテキストメニューの登録

定義

Activity.registerForContextMenu(view: View!): Unit
// パラメータ
// view: コンテキストメニューを表示するビュー

サンプルコード

MainActivity.kt
class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        val lvMenu = findViewById<ListView>(R.id.lvMenu)
        ...
        // 生成したコンテキストメニューを指定したビュー(ListView)に登録
        registerForContextMenu(lvMenu)
    }
}

コンテキストメニューのItem選択時の処理

参考: 研修2日目
コンテキストメニューオプションメニューと同様、アイテムが既定でリスナとして定義されているため、
アイテム選択時に呼び出されるonContextItemSelected()メソッドを用いて、
選択されたアイテムに応じた分岐処理(イベントハンドラ)を実装する。
アイテムが選択されない場合は、super.onContextItemSelected()の返り値(=false)を返却する必要がある。

サンプルコード

MainActivity.kt
class MainActivity : AppCompatActivity() {
    // コンテキストメニューItemの"タップ"イベント検知時の処理(イベントハンドラ)
    // onContextItemSelected(item:): オプションメニューのItemがタップされた場合に呼び出されるメソッド
    // item: タップされたItem
    override fun onContextItemSelected(item: MenuItem): Boolean {
        // 最終的に返却するBool値(初期値: true)
        var returnVal = true

        // AdapterContextMenuInfoオブジェクトの定義
        // -> コンテキストメニューを呼び出したItemの情報を格納
        val info = item.menuInfo as AdapterView.AdapterContextMenuInfo

        // コンテキストメニューを呼び出したItemのIndex番号
        val listPosition = info.position

        // コンテキストメニューを呼び出したItemのキーと値を格納するMutableList
        val menu = _menuList[listPosition]

        // タップされたItemに応じた分岐処理
        // MenuItem.itemId: ItemのID(R値)
        when(item.itemId) {
            R.id.menuListContextDesc -> {
                // トースト表示する文字列
                val desc = menu["desc"] as String

                // 表示するトーストの定義
                val toast = Toast.makeText(this@MainActivity, desc, Toast.LENGTH_LONG)

                // トーストの表示
                toast.show()
            }

            R.id.menuListContextOrder ->
                ...

            else ->
                // オプションメニューのItem以外が選択された場合は、
                // 親クラス(super)のonContextItemSelected(item:)メソッドの
                // 返り値(デフォルトではfalse)を返却
                returnVal = super.onContextItemSelected(item)
        }

        return returnVal
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0