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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

1回答

8417閲覧

入れ子にしたLinearLayout内のviewのIDやtextを取得・変更したい

Tsukasa7613

総合スコア10

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

2クリップ

投稿2019/01/24 11:59

編集2019/01/28 00:36

android studioでアプリケーションの開発をしています。(動作環境はAndroid8.0 API26)

まず初めにレイアウトをxmlで記述して表示した結果、想定通りのレイアウトを表示することができました。
動的にレイアウトを複数個 追加する必要があったため、LayoutInflater を使ってxmlファイルをレイアウトに追加する処理を書きました。
追加するxmlには 枠になるLinearLayout 内にLinearLayoutを複数配置してlayout_weight等でレイアウトを調整し、その中にボタンやテキストを配置しました。(下記にイメージ画像を添付します)

その結果、最深部にある TextView や ImageView の androidl:ID の動的な変更や、idを取得して setText が出来なくなってしまいました。(自分で学習した結果、getChildAt()ではLinearLayout内のLinearLayoutの子要素を取得できなかったためだと考えました。)

入れ子ではいけないのかと思い、Inflateを複数繰り返して入れ子にしていたLinearLayoutを表示してみましたが、layout_weight や layout_heightなどがなぜか無視されてしまいました。

入れ子上になっているレイアウトを複数個 動的追加するときの処理の書き方
このようなレイアウトを複数動的追加するときの実装方法
をご教授願います。

イメージ説明


追記
------------------ソースコード---------------------------
@Override
protected void onResume() {
super.onResume();

     // inflateでsub.xml(上記のxml)を取得
LayoutInflater inflater = LayoutInflater.from(this);
LinearLayout addLayout = (LinearLayout) inflater.inflate(R.layout.sub0, null);

    // addViewで追加
LinearLayout linearLayout = findViewById(R.id.food_lay);
linearLayout.addView(addLayout);

//画像出力処理?
ImageView imageView2 = findViewById(R.id.image);
imageView2.setImageResource(R.drawable.drink_milk_pack);

//ボタンの動作 //Button btclick = findViewById(R.id.btn_mainasu); //ClickListener listener = new ClickListener(); //btclick.setOnClickListener(listener);




}

onResumeに記述し、別画面に遷移後戻ってきたときにxmlが動的に追加されるように処理しています。
追加時にはボタンが動作しますが2個目以降の追加時に動かなくなってしまいました(IDが重複するため?)
そのため動的なIDの変更やリスナクラス・画像の指定が必要なのかなと考えたのですが方法がわかりませんでした。

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

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

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

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

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

keicha_hrs

2019/01/24 14:48

> 動的にレイアウトを複数個 追加する必要があったため、LayoutInflater を使ってxmlファイルをレイアウトに追加する処理を書きました。 このコードを提示していただかないことには回答は難しいと思います。
Tsukasa7613

2019/01/25 00:16

keicha_hrs様 返答ありがとうございます。 ソースコードを追記させていただきました。 初心者のため至らない点があるかと思いますが宜しくお願い致します。
keicha_hrs

2019/01/25 15:39

R.layout.sub0など、どのIDがどのコンポーネントを示しているのか、最初の図に加えることはできますか?また、動的にButtonのIDの動的変更という記述も見られますが、どうもこの辺は設計思想がまずそうな雰囲気がありますね。コードの中で Button button3 = new Button(this); int id = generateViewId(); button3.setId(id); のような形で、新たに生成したButtonインスタンスにIDを与えることは可能なので、こういうことをしたいと想像していたのですが、 <Button android:id="@+id/button3 /> のように予め用意されている入れ子用のレイアウトXMLファイルにandroid:id属性で与えられたIDの値をプログラム途中で変更したい、という話なのでしょうか。
Tsukasa7613

2019/01/28 02:41 編集

keicha_hrs様 連絡遅れて申し訳ありません。 レイアウトのイメージ図にidを追加させていただきました。なおコード中のR.id.food_layはR.id.sub0を追加する先の親レイアウトです。 IDの動的変更に関してですが、ボタンなどに動作を与えるためにsub0.xmlのファイルでidを指定したため、インスタンス生成後に個々でIDを変更しなければいけないと考えていました。 インスタンスに生成したIDを与えることが可能とのことですが、xmlファイルから生成したボタンにはxmlで記述したIDが割り当てられているため、動的な変更が必要なのかなと思いました。 IDを与えた後はどのようにクリックリスナの設定を書いていけばよいのでしょうか?sub0.xmlのレイアウトを複数動的追加する動作を行うのですが、クリックリスナの設定やクリック後の動作はどのようにすればよいでしょうか。動的追加する分、動的にクリックリスナを追加する必要があって大量になるのでしょうか。
keicha_hrs

2019/01/28 09:16 編集

どうも示された図とコードが結びつきませんね。R.id.sub0で示される子レイアウト中に、さらに3つの孫レイアウトを作り、それらの孫レイアウトの中にImageViewなりTextViewなりButtonなりを配置することをお考えなのですよね?ただ、今のコードだとこの「孫レイアウト」に相当するものが見えてこないので、よく理解できずにいます。「孫レイアウト」に相当するものもそれぞれxmlファイルで作成するのか、これらは「どうしてもコードによって動的に配置しなければならない制約」が存在するのか、それによっても随分方針が変わってくるように思います。
jimbe

2019/01/29 10:39

何を作っていらっしゃるのか分かりませんが, 本当に, 動的にレイアウトを追加する必要があるのでしょうか. 最初の「動的にレイアウトを複数個 追加する必要があった」の部分から, 何か怪しさを感じています. それは単に幾つかのレイアウト(フラグメント等?)のうちの一つを表示するというのではダメだったのでしょうか. ケチを付けるつもりはありません. ただ, 大変な苦労をした割りにインターフェースとして効果が無かったということになってしまうのではと危惧しています.
Tsukasa7613

2019/01/30 02:15

jimbe様 コメントありがとうございます。 アプリの内容としては、DBに格納してある食品データをリストにして表示・編集・追加するアプリを作成することが目的でした。リスト内のデータに食品名・賞味期限・在庫数(残量数)・残量を減らすためのボタンを実装するため一つのレイアウトを作成し、複数個動的追加する処理を考えていました。 そのほか食品の詳細を表示するためにレイアウト自身にIDを持たせ、タップされたときに画面遷移を行ったり...と想定していた使用はいくらかあるのですが、その中でレイアウトを動的追加しつつIDを持たせて押されたときの処理が必要かなと悩んでいました。
jimbe

2019/02/04 08:08 編集

サンプルを書いてみるべきか考えているうちに他に手が回ってしまいました, 失礼しました. お聞きするに, 動的追加をするのはリストを含む画面なのですね. ご質問に付けられたイメージ図は, リストの1行ということでしょうか. リストならば, アプリ側で XML を展開しなくても普通にビューとして表示できるかと思いますが, ViewType など使用しての複数のレイアウトを使ったリスト表示のご経験は御座いませんか?
jimbe

2019/02/04 07:37

最初に「想定通りのレイアウトを表示することができ」たということで, その XML は残っていますでしょうか. 宜しければそれにどこがどう動的に変わりたいのかをマーキングしてご提示頂けませんでしょうか.
guest

回答1

0

どのような回答をすれば要件を満たすのかわからないので、ひとまず適当にサンプルを作ってみました。「動的」という要素が出てきませんが、難しくするよりは孫レイアウトとなるxmlファイルを作成しておいて描画するのが簡単なのでは?というつもりで書いています。これが意図したものと異なるのであれば、そこから話を進めることができれば。

java

1public class MainActivity extends AppCompatActivity { 2 private int x = 0; 3 private int y = 0; 4 private int z = 0; 5 6 @Override 7 protected void onCreate(@Nullable Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 11 } 12 13 @Override 14 protected void onResume() { 15 super.onResume(); 16 17 final LinearLayout parent = findViewById(R.id.food_lay); 18 final LayoutInflater inflater = LayoutInflater.from(this); 19 20 final LinearLayout subLayout0 = 21 (LinearLayout) inflater.inflate(R.layout.sub0, null); 22 parent.addView(subLayout0); 23 24 final LinearLayout sub0 = findViewById(R.id.sub0); 25 final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 26 ViewGroup.LayoutParams.MATCH_PARENT, 27 ViewGroup.LayoutParams.MATCH_PARENT, 28 1 29 ); 30 31 final LinearLayout grandsonLayout0 = 32 (LinearLayout) inflater.inflate(R.layout.grandson0, null); 33 sub0.addView(grandsonLayout0, params); 34 35 final LinearLayout grandsonLayout1 = 36 (LinearLayout) inflater.inflate(R.layout.grandson1, null); 37 sub0.addView(grandsonLayout1, params); 38 39 final LinearLayout grandsonLayout2 = 40 (LinearLayout) inflater.inflate(R.layout.grandson2, null); 41 sub0.addView(grandsonLayout2, params); 42 43 final ImageView imageView1 = grandsonLayout0.findViewById(R.id.imageView1); 44 imageView1.setImageResource(R.drawable.drink_milk_pack); 45 46 final TextView textView1 = grandsonLayout1.findViewById(R.id.textView1); 47 textView1.setText(String.valueOf(x)); 48 49 final TextView textView2 = grandsonLayout1.findViewById(R.id.textView2); 50 textView2.setText(String.valueOf(y)); 51 52 final TextView textView3 = grandsonLayout2.findViewById(R.id.textView3); 53 textView3.setText(String.valueOf(z)); 54 55 Button btn_mainasu = grandsonLayout2.findViewById(R.id.btn_mainasu); 56 btn_mainasu.setText("Count!!"); 57 btn_mainasu.setOnClickListener(new ClickListener(textView3)); 58 59 x++; 60 y++; 61 } 62 63 class ClickListener implements View.OnClickListener { 64 private TextView textView3; 65 66 ClickListener(TextView v) { 67 textView3 = v; 68 } 69 70 @Override 71 public void onClick(View v) { 72 z++; 73 textView3.setText(String.valueOf(z)); 74 } 75 } 76 77 @Override 78 protected void onPause() { 79 super.onPause(); 80 LinearLayout parent = findViewById(R.id.food_lay); 81 parent.removeAllViews(); 82 y = 0; 83 } 84 85 @Override 86 protected void onDestroy() { 87 super.onDestroy(); 88 x = 0; 89 z = 0; 90 } 91}

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/food_lay" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 tools:context=".MainActivity" />

sub0.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/sub0" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="horizontal"/>

grandson0.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 <ImageView 8 android:id="@+id/imageView1" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" /> 11</LinearLayout>

grandson1.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 <TextView 8 android:id="@+id/textView1" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:textSize="30sp" /> 12 13 <TextView 14 android:id="@+id/textView2" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:textSize="30sp" /> 18</LinearLayout>

grandson2.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 <TextView 8 android:id="@+id/textView3" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:textSize="30sp" /> 12 13 <Button 14 android:id="@+id/btn_mainasu" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:textSize="30sp" /> 18</LinearLayout>

投稿2019/01/28 13:18

編集2019/01/28 13:20
keicha_hrs

総合スコア6768

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

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

Tsukasa7613

2019/01/29 04:57

keicha_hrs様 回答ありがとうございます。サンプルプログラムを動かしてみました。質問内容でうまく言葉にできず、回答要件を提示できなくて済みませんでした。 私がイメージしていたアプリではkeicha_hrs様から作成していだたいたレイアウトのsub0以下の要素を動的(他のボタンクリック時・onResumeで他の画面から戻ってきた時など)に3,4個複製させること、btn_mainasuボタンやレイアウトレイアウトのIDを取得してタッチ時の処理を行うことが目標でした。 まとめるとxmlから生成したレイアウトを複製した際にIDの振り方・取得の仕方がわからないという質問でした。 私側でもレイアウトを小分けにして表示させようとしてみましたが結局IDをgenerateして振った後のクリックの処理の書き方がわからずにいました。(OnClickメソッド内のクリックされた対象による分岐を増やさなければいけない?という考えが実装できませんでした。) 孫の追加の方法は私のイメージ通りで、ソースは参考になる記述でした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問