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

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

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

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

Android

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

Q&A

解決済

1回答

7105閲覧

Android:動的生成textのid指定について

marimo1031

総合スコア4

Java

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

Android

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

0グッド

0クリップ

投稿2020/05/20 07:30

前提・実現したいこと

プログラムで動的に生成したEdittextのidが知りたい。
そのidを参照してEdittextに入力されている文字を保存したい。

発生している問題・エラーメッセージ

動的に生成したEdittextのidが不明なため、idの参照ができない。

該当のソースコード

java

1 while ((line = bufferReader.readLine()) != null) {  //csvに保存したデータを読み終わるまでループ 2 3 String[] data = line.split(",", 0); 4 5 LinearLayout layout = findViewById(R.id.linearLayout);  // 6 View view = getLayoutInflater().inflate(R.layout.sub, null); 7 layout.addView(view); //subレイアウトデータをmainレイアウトに入れています。 8 9 EditText editText = view.findViewById(R.id.editText);// edittextを動的に生成している為、初回のidは読取ができています。2回目以降idが変化している為読み込みができません。 10 editText.setText(data[0]);

試したこと

edittextを動的生成した際にidを割り当てる方法を調べましたが分からない状態です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/05/20 08:34

エラーもレイアウトの内容もろくに書かれてませんのでよくわかりませんが、 > View view = getLayoutInflater().inflate(R.layout.sub, null); で指定しているレイアウト (R.layout.sub) の中に、editTextというidを指定したEditTextはあるんでしょうか?
keicha_hrs

2020/05/20 08:39

「edittextを動的に生成している為、初回のidは読取ができています」の意味がよくわかりません。「初回はxmlで配置したEditTextを得ていて、2回目以降はnewで生成したEditTextにIDを付与したい」ということなのだろうか。
marimo1031

2020/05/20 08:45

xmlに記載したレイアウトをベースにループさせています。 その為、初回はidを得ていますが、2回目以降のidがどのようになっているのかが分かりません。
退会済みユーザー

退会済みユーザー

2020/05/20 09:12

> 動的に生成したEdittextのidが不明なため、idの参照ができない。 は何を持ってしてそう言っていますか? 書いてあるコードだけですと、何も問題が出ないと思うので、質問者さんが何を伝えたいかが不明です。
marimo1031

2020/05/20 12:16

ご回答ありがとうございます。 分かりづらくて申し訳ありません。
hoshi-takanori

2020/05/20 13:26 編集

そのソースで問題なく動くはずですが…。 view.findViewById(R.id.editText) は view の下にある id が R.id.editText なものを返すので。 たぶん、Activity の findViewById と混同しているのでは? なお、ループの外で各 EditText にアクセスしたいのであれば、ループの中で view.findViewById した値を配列か何かに入れておく必要があります。(そもそも findViewById は効率が良くないので、同じビューに対して何度も findViewById するのは良くないです。)
marimo1031

2020/05/21 02:19

ありがとうございます。 始めたばかりの為、理解できていないとは思いますが IDは毎回生成されているという事でしょうか。 その為、毎回配列で保存しておくという事でしょうか。
hoshi-takanori

2020/05/21 04:20

Android 以前の Java のオブジェクトの話になりますが、例えば id というプロパティを持つ User クラスがあって、コンストラクタで id を指定するとして、 User user1 = new User(100); User user2 = new User(100); とすると、user1 と user2 は異なるオブジェクト (id の値は同じだけど) であるということは理解されてますか?
marimo1031

2020/05/21 04:25

それについては理解しています。
hoshi-takanori

2020/05/21 04:56

なら、 View view1 = getLayoutInflater().inflate(R.layout.sub, null); EditText editText1 = view1.findViewById(R.id.editText); View view2 = getLayoutInflater().inflate(R.layout.sub, null); EditText editText2 = view2.findViewById(R.id.editText); とした場合に editText1 と editText2 は id は同じでも異なるオブジェクトになることも分かりますよね。
marimo1031

2020/05/21 04:59

それもわかります。
hoshi-takanori

2020/05/21 05:05 編集

それをループにして、こんな感じにリストに入れて使えばいいのでは。 List<EditText> editTextList = new ArrayList<>(); for (int i = 0; i < 10; i++) { View view = getLayoutInflater().inflate(R.layout.sub, null); EditText editText = view.findViewById(R.id.editText); editTextList.add(editText); }
marimo1031

2020/05/21 05:33

このループですと、後にid指定で処理を行う場合にedittextのidが分からないと思うのですが。 どうでしょう。・・・
hoshi-takanori

2020/05/21 05:36

id を使うのは findViewById するためなので、オブジェクトを取得した後は id を気にする必要はありません。(万が一 id を動的に生成するにしても、同じようにリストか何かで管理することになりますし。)
marimo1031

2020/05/21 05:42

なるほどです。 今回idを生成して、そのidに割り当てられているtextなどに文字を入れて表示させていて その為、最初にidが知りたかったのです。
guest

回答1

0

ベストアンサー

なんとなく意味はわかりましたが、良い方法なのかあまり自信がないのでその前提で。

複数配置されるsub.xmlの中にID指定で入っているEditTextは、何度配置しても同じIDになってしまいます。そのままでは区別して操作することは不可能だと思うので、sub.xmlをaddView()した時点ですぐにEditTextに新たなIDを与えてはどうでしょうか。

java

1 private int[] editTextIds; 2 3 (中略) 4 5 editTextIds = new int[10]; // 何個必要になるのかわかりませんが必要な数だけ 6 7 { 8 int i = 0; 9 10 LinearLayout layout = findViewById(R.id.linearLayout); // 11 View view = getLayoutInflater().inflate(R.layout.sub, null); 12 layout.addView(view); //subレイアウトデータをmainレイアウトに入れています。 13 14 EditText editText = view.findViewById(R.id.editText); 15 // 新たなIDを与える 16 editTextIds[i] = ViewCompat.generateViewId(); 17 editText.setId(editTextIds[i]); 18 i++; 19 } 20 21 22 23 { 24 EditText editText = findViewById(editTextIds[0]); 25 editText.setText("hogehoge"); 26 } 27

こうして配置した時点ですぐに新IDを付与し、以後はeditTextIds[]を使って目的のEditTextを取得すれば、個別にテキストを取得したりセットしたりすることができると思います。

ただし、generateViewId()を用いるにはminSdkVersionが17以上である必要があります。

(2020/05/21 回答訂正)

投稿2020/05/20 09:20

編集2020/05/21 08:27
keicha_hrs

総合スコア6768

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

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

marimo1031

2020/05/20 12:14

やりたいことはご回答の通りです。 idの付与の仕方が分からなかったため助かりました。
keicha_hrs

2020/05/20 13:42

あー、hoshi-takanoriさんの指摘通り何もしなくても特に問題ないのかもしれない。
marimo1031

2020/05/21 02:20

そうなんですね、参考にさせていただきます。
hoshi-takanori

2020/05/21 06:02

質問に対する直接の答えとしてはこれで合ってると思います。 質問文のコメントにも書きましたが、view の id は findViewById するためのものなので、各 layout xml の中で一意であれば問題ありません。特に、同じ layout xml から複数のインスタンスを生成する場合、Activity 全体に対して findViewById すると id が重複しますが、生成した各 view に対して view.findViewById すれば何の問題もありません。実際、ListView や RecyclerView ではそうなってます。 generateViewId はたぶん、LayoutInflator 的な仕組みを自分で作りたい場合とかに使うのではないでしょうか。
keicha_hrs

2020/05/21 08:26

> kakajikaさん ありがとうございます。回答も訂正させていただきます。
kakajika

2020/05/21 13:31

> hoshi-takanori さん viewのidはfindViewById以外にも利用されます。RelativeLayoutやConstraintLayoutで動的に生成したViewの関係性を設定するのにも使いますし、onSaveInstanceState時にViewの状態を保存する際にもIDが設定されているかどうかがキーになります。generateViewIdはそのような場合に利用できると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問