2011/04/13

ListViewにコンテキストメニュー追加とクリップボードにコピー

ここ>を参考にして、ListViewにコンテキストメニュー(ロングクリックで出てくるメニュー)を追加した。

1.ListViewにロングクリックリスナーを設定していると実行時エラーになるのでロングクリックリスナーは削除しておく。
2.コンテキストメニューで何を選択されたかは、MenuItem#getTitle()で取得。
3.ListViewのどの位置で押されたかは、MenuItem#getMenuInfo()をAdapterContextMenuInfoにキャストして、AdapterContextMenuInfo#positionで取得。
4.クリップボードへのコピーはClipboardManagerを使うだけで超簡単。

//  コンテキストメニュー表示
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, view, menuInfo);
    AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo;
    ListView listView = (ListView) view;
    Map map = (Map) listView.getItemAtPosition(adapterInfo.position);
    Log.d(LOGTAG, "DBG:onCreateContextMenu position=" + adapterInfo.position);
    menu.setHeaderTitle(map.get("name").toString() + map.get("subject").toString());
    menu.add(getString(R.string.ContextMenuResend));
    menu.add(getString(R.string.ContextMenuCopySubject));
    menu.add(getString(R.string.ContextMenuCopyBody));
}
// コンテキストメニュー処理部
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) item.getMenuInfo();
    Log.d(LOGTAG, "DBG:onContextItemSelected adapterInfo.position=" + adapterInfo.position);
    String strKindOfMenu = (String)item.getTitle();
    Log.d(LOGTAG, "DBG:onContextItemSelected getTitle=" + strKindOfMenu);
    if(strKindOfMenu.equals(getString(R.string.ContextMenuResend))){ // 再送信/返信の時
        setResendMessage(adapterInfo.position);
    }else{        // クリップボードにコピーの時
        copySubjectBody(strKindOfMenu, adapterInfo.position);
    }
        return super.onContextItemSelected(item);
}
// 件名・本文をクリップボードへコピー
protected void copySubjectBody(String strKindOfCopy, int position) {
    Map<String, Object> map = (Map<String, Object>) listview.getItemAtPosition(position);
    long messageId = (Long) map.get("messageId");
    MessageCursor mc = gmail.getMessageCursorForMessageId(account, messageId);
    if(mc.next()){
        ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); // クリップボードマネージャ
        if(strKindOfCopy.equals(getString(R.string.ContextMenuCopySubject))){ // 件名をコピー
            cm.setText(mc.getSubject());  // クリップボードへ件名をコピー
        }else if(strKindOfCopy.equals(getString(R.string.ContextMenuCopyBody))){ // 本文をコピー
            cm.setText(Html.fromHtml(mc.getBody())); // クリップボードへ本文をコピー
        }
        Toast.makeText(this, strKindOfCopy + getString(R.string.msgFinish), Toast.LENGTH_SHORT).show(); // トーストで完了を表示
    }
}

0 件のコメント:

コメントを投稿