質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

4173閲覧

コンテキストメニューで、MenuItemにデータを渡したい

usugita_san

総合スコア226

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/02/10 05:41

こちらの記事を元にして、コンテキストメニューを表示しました。
http://techbooster.org/android/ui/13709/

問題は、メニューの選択時に、MenuInfoを経由してデータを渡せない事です。

lang

1 //コンテキストメニューの表示 2 @Override 3 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 4 super.onCreateContextMenu(menu, v, menuInfo); 5 Log.d(TAG, "onCreateContextMenu 開始"); 6 MenuItem menuItem = menu.add(0,1,0, "hogehoge"); 7 Log.d(TAG, "onCreateContextMenu 終了"); 8 } 9 //コンテキストメニューの選択 10 @Override 11 public boolean onContextItemSelected(MenuItem item) { 12 Log.d(TAG, item.getItemId() + "のアイテムが選ばれました"); 13 item.getMenuInfo(); //この結果がnull 14 return super.onContextItemSelected(item); 15 }

例えば、TextViewの表示内容を渡して処理を変更するとか、どういった動作を行いたいのですが、データの渡し方が解らないのです。
どのようにデータを渡せば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こういうことでしょうか
リストビュー内のコンテキストメニュー - Android開発入門

Viewから情報を得たいのであれば、ArrayAdapterのgetViewメソッドはpublicメソッドなので、

lang

1View view = adapter.getView(position, null, null); 2TextView tv = (TextView) view.findViewById(R.id.textView1);

などでなんとかならないでしょうか?

投稿2015/02/14 12:32

編集2015/02/14 12:38
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usugita_san

2015/02/15 03:18

ありがとうございます。 幸いなことに、もう少し違う方法で実現する事が出来ました。 参考までに掲載致しましたので、ご確認下さい。
guest

0

このようにしてTextViewの文字列を取得できます。

lang

1 @Override 2 public boolean onContextItemSelected(MenuItem item) { 3 int id = item.getItemId(); 4 TextView v = (TextView)findViewById(R.id.textView1); 5 CharSequence cs = v.getText(); 6 return super.onContextItemSelected(item); 7 }

投稿2015/02/10 12:44

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usugita_san

2015/02/11 03:50

すみません、質問が間違っていました。 Activityから直接呼び出せないViewからデータを取得したかったのです。 具体的には、ListViewのAdapter内で、getViewメソッド内で呼び出される様々なViewからデータを取得できないだろうか、と考えたのです。 申し訳ありません。もう少し自分で調べてみます。
guest

0

自己解決

自己解決しました。良いご意見も頂いたのですが、せっかくなので私の解決方法も掲載してみます。
ListViewに以下のようにタップのイベントを定義します。このイベントでコンテキストメニューを表示します。()

lang

1private AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() { 2 @Override 3 public void onItemClick(AdapterView<?> listView, View view, int position, long id) { 4 Log.d(TAG,"たっぷされたお"); 5 HogeListAdapter adapter = (HogeListAdapter )listView.getAdapter(); 6 HogeItem hogeItem = (HogeItem )adapter.getItem(position); 7 if(null != hogeItem ) { 8 Log.d(TAG,"アイテムみつかった!メニューひらくよ!"); 9 view.setTag(R.string.tag_hoge_item,hogeItem ); 10 activity.registerForContextMenu(view);//コンテキストメニューを開くアクティビティに、Viewを登録する 11 view.showContextMenu();//ロングタップでないので、こうやって呼び出す必要がある 12 view.setLongClickable(false);//ロングタップ無効 13 14 }else{ 15 Log.d(TAG,"タップされたけど、アイテムなかったらしい"); 16 } 17 Log.d(TAG,""); 18 } 19 };

ポイントとしては、AdapterからgetItem(position)でアイテムを取得する事と、
Viewにタグを設定している事です。
タグの設定の時にリソースを指定できるのですが、こうする事でリソースIDの種類によって数種類の情報をタグに入れられるので便利です。

次にActivityです。

lang

1 2 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) { 3 super.onCreateContextMenu(menu, view, info); 4 HogeItem hogeItem = (HogeItem )view.getTag(R.string.tag_hoge_item); 5 if(null != hogeItem){ 6 //アイテムをロングタップしたようです。 7 getMenuInflater().inflate(R.menu.hogelist_context_nemu, menu); 8 for(int i = 0;i < menu.size();i++) { 9 MenuItem menuItem = menu.getItem(i); 10 menuItem.setActionView(view); 11 } 12 } 13 }

ポイントは、タグを指定してitemを取得し、内容によって処理を切り分ける事。
また、表示するメニューのmenuItemに、setActionView(view)によってViewを与えている事。

最後に、メニューのクリック時のイベントです。

lang

1 2 @Override 3 public boolean onContextItemSelected(MenuItem item) { 4 View v = item.getActionView(); 5 HogeItem hogeItem = (HogeItem)v.getTag(R.string.tag_hoge_item); 6 }

メニューのクリック時のイベントで、タグを指定してViewを取り出します。
これで、選択したアイテムの情報を取得出来ました。

投稿2015/02/15 03:16

usugita_san

総合スコア226

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問