
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 件のコメント:
コメントを投稿