ページ

2012年4月7日土曜日

ListViewにContextMenuを追加する

ListViewにContextMenu(右クリックで表示されるMenuのようなもの)を追加します。
ListViewのアイテム単位に制御が可能になるよう実装してみる。

ActivityでもFragmentでも両方同じ要領で実装出来そう。
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        // ListViewを取得する。
        ListView listView = (ListView) frame.findViewById(R.id.list_view);

        // ContextMenuを利用出来るよう設定
        registerForContextMenu(listView);
        ・・・
    }

    /*
     * ContextMenu生成時に呼び出されるメソッド.
     * 今回の設定ではListViewのindex=0,1はContextMenuが表示されないよう制御.
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, view, menuInfo);

        // ListViewにキャストする。
        ListView listView = (ListView) view;
        // AdapterContextMenuInfoにキャストする。
        AdapterContextMenuInfo contextMenuInfo= (AdapterContextMenuInfo) menuInfo;

        if (contextMenuInfo.position == 0) {
            // ListViewのindex=0(1番目のMenuを設定する)
        } else if (contextMenuInfo.position == 1) {
            // ListViewのindex=1(2番目のMenuを設定する)
        } else {
            // その他のindexのMenuを設定する。
            menu.setHeaderTitle("ContextMenuのタイトル");
            menu.add("menu1");
            menu.add("menu2");
            menu.add("menu3");
        }
    }

    /*
     * メニューがクリックされた際に呼び出されるメソッド.
     */
    @Override
    public boolean onContextItemSelected(MenuItem item) {

        // menu名を取得
        String menuName = item.getTitle().toString();
        // ContextMenuInfoを取得
        AdapterContextMenuInfo detailInfo = (AdapterContextMenuInfo) item.getMenuInfo();

        if ("menu1".equals(menuName)) {
            Log.d("sample", detailInfo .position + "の" + menuName + "処理を実行");
        } else if ("menu2".equals(menuName)) {
            Log.d("sample", detailInfo .position + "の" + menuName + "処理を実行");
        } else if ("menu3".equals(menuName)) {
            Log.d("sample", detailInfo .position + "の" + menuName + "処理を実行");
        }
        return true;
    }
こんな感じで実現出来た。正しい使い方かは不明・・・。
おわり。

0 件のコメント:

コメントを投稿