前提・実現したいこと
プログラムで動的に生成した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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
エラーもレイアウトの内容もろくに書かれてませんのでよくわかりませんが、
> View view = getLayoutInflater().inflate(R.layout.sub, null);
で指定しているレイアウト (R.layout.sub) の中に、editTextというidを指定したEditTextはあるんでしょうか?
「edittextを動的に生成している為、初回のidは読取ができています」の意味がよくわかりません。「初回はxmlで配置したEditTextを得ていて、2回目以降はnewで生成したEditTextにIDを付与したい」ということなのだろうか。
xmlに記載したレイアウトをベースにループさせています。
その為、初回はidを得ていますが、2回目以降のidがどのようになっているのかが分かりません。
> 動的に生成したEdittextのidが不明なため、idの参照ができない。
は何を持ってしてそう言っていますか?
書いてあるコードだけですと、何も問題が出ないと思うので、質問者さんが何を伝えたいかが不明です。
ご回答ありがとうございます。
分かりづらくて申し訳ありません。
そのソースで問題なく動くはずですが…。
view.findViewById(R.id.editText) は view の下にある id が R.id.editText なものを返すので。
たぶん、Activity の findViewById と混同しているのでは?
なお、ループの外で各 EditText にアクセスしたいのであれば、ループの中で view.findViewById した値を配列か何かに入れておく必要があります。(そもそも findViewById は効率が良くないので、同じビューに対して何度も findViewById するのは良くないです。)
ありがとうございます。
始めたばかりの為、理解できていないとは思いますが
IDは毎回生成されているという事でしょうか。
その為、毎回配列で保存しておくという事でしょうか。
Android 以前の Java のオブジェクトの話になりますが、例えば id というプロパティを持つ User クラスがあって、コンストラクタで id を指定するとして、
User user1 = new User(100);
User user2 = new User(100);
とすると、user1 と user2 は異なるオブジェクト (id の値は同じだけど) であるということは理解されてますか?
それについては理解しています。
なら、
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 は同じでも異なるオブジェクトになることも分かりますよね。
それもわかります。
それをループにして、こんな感じにリストに入れて使えばいいのでは。
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);
}
このループですと、後にid指定で処理を行う場合にedittextのidが分からないと思うのですが。
どうでしょう。・・・
id を使うのは findViewById するためなので、オブジェクトを取得した後は id を気にする必要はありません。(万が一 id を動的に生成するにしても、同じようにリストか何かで管理することになりますし。)
なるほどです。
今回idを生成して、そのidに割り当てられているtextなどに文字を入れて表示させていて
その為、最初にidが知りたかったのです。
回答1件
あなたの回答
tips
プレビュー