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