今回はListViewの項目を長押ししたときに項目別のポップアップメニューを表示してみます。
まず事前に項目ごとのメニューリソースを作成しておきます。
・listview_item1_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/listViewItem1Menu" android:title="Item1Menu"/> </menu>
・listview_item2_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/listViewItem2Menu" android:title="Item2Menu"/> </menu>
次にListViewのOnItemLongClickListenerにリスナを設定します。リスナはActivity.onCreate()の中などで設定します。
※ListViewのOnLongClickListenerでないことに注意。この違いに気付かず1時間ぐらいハマってました(´・ω・`)
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // 長押しされた項目でMenuInflater.inflate()に指定するメニューリソースを切り替える PopupMenu popup = new PopupMenu(getApplicationContext(), view); MenuInflater inflater = popup.getMenuInflater(); if (position == 0) { // 1番目の項目を長押しされたときはlistview_item1_menuのメニューを表示 inflater.inflate(R.menu.listview_item1_menu, popup.getMenu()); } else if (position == 1) { // 2番目の項目を長押しされたときはlistview_item2_menuのメニューを表示 inflater.inflate(R.menu.listview_item2_menu, popup.getMenu()); } popup.show(); return true; } }PopupMenuクラスのコンストラクタには、ポップアップメニューを関連付けるViewを指定します。その後、PopupMenu.getMenuInflater()でMenuInflaterを取得、MenuInflater.inflate()にメニューリソースを指定してメニューを作成します。この流れは他のメニューと同じですね。
上記コードを実際に動作させたときのキャプチャがこちら。
1番目の項目を長押したときは1番目の項目すぐ下にlistview_item1_menuが表示され、2番目の項目を長押ししたときは2番目の項目のすぐ下にlistview_item2_menuが表示されました。