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

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

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

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

Android

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

Q&A

解決済

2回答

3034閲覧

AndroidでImageButtonの存在有無をID名から判断する方法

yamayamak

総合スコア131

Java

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

Android

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

0グッド

0クリップ

投稿2017/03/30 10:48

いろいろやっているのですが、わからないので質問させてください。

現状、150個のImageButtonがあります。
どれが存在しているかわからない状態なので、1から150まで順に調べていき
存在したらsetOnLongClickListenerを設定します。
ImageButtonのID名は"btn1"〜"btn150"までの順番の名前をつけています。

これを以下のように記載してみましたが動きませんでした。
どのように記載すべきかご教授願います。

// 長押しボタンにロングクリックのListenerを設定 for(int i=1;i<=150;i++){ String idName = "btn"+i; try { int btnId = getResources().getIdentifier(idName, "id", getPackageName()); ImageButton iBtn = (ImageButton)findViewById(btnId); iBtn.setOnLongClickListener(new View.OnLongClickListener() { // ボタンが長押しクリックされた時のハンドラ @Override public boolean onLongClick(View view) { String viewName = getResources().getResourceEntryName(view.getId()); if ( viewName.indexOf("btn") != -1 ) { // 番号を取り出す viewName = viewName.replaceAll("btn", ""); // 設定画面へ遷移 MainActivity activity = new MainActivity(); Intent intent = new Intent(activity, setRcvIrActivity.class); intent.putExtra("SET_R_NUM", Integer.parseInt(viewName)); // 遷移先から返却されてくる際の識別コード int requestCode = 102; // 返却値を考慮したActivityの起動を行う startActivityForResult(intent, requestCode); } return true; } }); } catch (android.content.res.Resources.NotFoundException e) { // TODO Auto-generated catch block //e.printStackTrace(); } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

おそらく、リスナーはつけられています。
onLongClickの先頭でログ出力を行い、処理が来ているかを確認してください。

ただ単に遷移処理が間違っていますね。
Activityはインスタンス化してはいけません。

投稿2017/03/30 11:49

編集2017/03/30 11:55
yona

総合スコア18155

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

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

yamayamak

2017/03/30 15:25

ありがとうございます。 > MainActivity activity = new MainActivity(); > Intent intent = new Intent(activity, setRcvIrActivity.class); ここですね、ここもわからなくてとりあえずインスタンス化してみました。 Intent intent = new Intent(this, setRcvIrActivity.class); でthisに赤線が出るのでインスタンス化してみました。 別の問題とは思いますが、こういう場合はどのようにすべきでしょうか?
yamayamak

2017/03/30 15:36

このプログラムを動かすと、IDは取得できているのですが、 int btnId = getResources().getIdentifier(idName, "id", getPackageName()); これはIDを取得できているようです。(idNameが"btn1"の時) ImageButton iBtn = (ImageButton)findViewById(btnId); でiBtnがNULLになります。ImageButtonは取得できないのでしょうか? ここらへんが理解できておりません。
yona

2017/03/30 15:37

Intentの引数にはthisではなく、MainActivity.thisにしてください。
yona

2017/03/30 15:39

具体的なbtnIdの値を確認してください、ない場合は0を返しているはずです。
yamayamak

2017/03/31 02:56

コメント回答ありがとうございます。Activityは、そのように変更します!勉強になります!ありがとうございます。 今、デバッグで見ているのですが、 ImageButton iBtn = (ImageButton)findViewById(btnId); が取得できない理由は、Segementで表示しているのですが、そのImageButtonがエミュレータで表示される前に取得しようとしていてnullになっているようにも見えてます。 segmentのtab1Activity.javaの中で以下のレイアウトをinflate後に上記のimageButtonを取得しようとしてもエミュレータでは、まだ、ボタンが表示されていない状態で取得しているように見えます。 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(frag_tab1, container, false); // 長押しボタンの設定 onLongBtnSet(); return rootView; } onLongBtnSetでImageButton iBtn = (ImageButton)findViewById(btnId);で取得を試みてみましたがnullのままでした。 これはどのように解決すれば良いかご教授いただければ幸いです。
yona

2017/03/31 03:03 編集

Segmentではなく、Fragmentのあやまりですか? その場合、そのライフスタイルメソッドではダメですね、Viewツリーは完成していないので、どのViewにアクセスしてもnullになります。 onViewCreatedをオーバーライドしてonLongBtnSetを呼び出して見てください。
yamayamak

2017/03/31 03:04

補足ですが、ImageButtonはtab1のsegmentレイアウト(frag_tag1.xml)で <ImageButton android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/button_off" android:onClick="onBtnClicked" /> というように記載されています。
yamayamak

2017/03/31 03:05

回答ありがとうございます。補足は無視してください。ご教授頂いたように変更させて頂きます。
yamayamak

2017/03/31 03:08

ご指摘のとおり、Fragmentの誤りです。勉強になります。試してみます!
guest

0

findByIdをお使いください。


上記、間違え回答ママなので更新を・・

findByIdでViewが取れていなければnullが返ってきますので、ListenerをセットできていることからImageButton自体は取れている物と思われます。
もしnullが返る可能性があるのであれば判定は入れておいた方がよいと思います。

ですのでその先のListener側の処理を確認してみるとよいかと。
失礼しました。

投稿2017/03/30 11:32

編集2017/03/30 13:02
uniko

総合スコア448

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

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

uniko

2017/03/30 11:45 編集

ん?これidが分かってないって話かな?
uniko

2017/03/30 12:05

申し訳ありません。質問内容を履き違えてました。 おそらくyonaさんの回答の通りです。
yamayamak

2017/03/30 15:32

ご指摘ありがとうございます。NULL判定は必要だと思います。 順番にbtn1からbtn150までIDを見ていくのですが、今存在するImageButtonのIDのみ取得することも可能でしょうか? もしできるならそちらの方に書き換えたいです。 10個のImageButtonがあれば、そのIDを順番に取得したいです。 すみませんが、よろしくお願いします。
uniko

2017/03/30 15:45

全件チェックではなく今あるレイアウトに対しImageButtonを抜き出して確認と言う意味なら、 ルートレイアウト(ViewGroup)から ViewGroup#getChildAt(int index) を行う事で現在配置されているImageButtonを抜く事ができますよ。
uniko

2017/03/30 15:46

indexは同じようにViewGroup#getChildCount()でカウントとって回して、抜き出したViewに対しinstanceofでImageButtonか判定すればよいかなと。 その後、getResources().getResourceEntryName(view.getId())で該当のIDに含まれてるかみてもよいのでは? こうゆう意味でしょうかね?ご参考になれば。
yamayamak

2017/03/31 02:58

そういう意味です!ありがとうございます! そういうことができるのですね。勉強になります。では、少しこちらでも試して見ます。 本当にありがとうございますm(_ _)m
uniko

2017/03/31 03:09

いえいえ。取得だけであればこちらのブログ様が余計なものがなくシンプルなので参考になるかもしれません。 http://t-kashima.hateblo.jp/entry/20110922/1316703113 *Viewのクラス判定等はやっていませんのでそこは注意。
yamayamak

2017/03/31 03:37

ありがとうございます。非常に勉強になりました。 また、こちらの質問の件名が意図がはっきりせず回答はそのとおりでした。 結局、問題はFragmentでのviewの取り方に問題が1番の原因に思いますので、onViewCreatedで記載して解決しています。すみませんが、こちらの問題の質問をさせて頂いた方にベストアンサーとさせて頂きました。 いろいろ教えて頂き申し訳有りませんが、本当にありがとうございました!
uniko

2017/03/31 03:40

いえいえ。こちらこそ申し訳ありません。解決したようでようございました。 onViewCreatedと言う事で補足ですが、onViewCreatedの引数にあるviewがFragmentのrootViewなのでそれに対して先ほどまでのコメントの方法をとればやりたい事も出来る思います。 ぺこり。
yamayamak

2017/03/31 04:32

ご指摘の通りです。ありがとうございます。 今から試して見ます!viewを順次取得できるのは勉強になりました。 ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問