• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:android TableLayout使用時で)

Android TableLayout使用時のTextViewの使いまわしについて

このQ&Aのポイント
  • AndroidのTableLayoutを使用してTextViewに値を入れる際、xmlのTextViewを使いまわすことはできるのか?
  • 試した結果、xmlで事前にTextViewを記述しないと使えないことがわかった。
  • TableにTextViewを3つ使いたい場合には、事前にTextViewを3つ記述する必要がある。

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.2

ちょっとXMLレイアウトファイルについて、誤解があるような気がします。 XMLによるレイアウトファイルがどのように利用されるのか、うまくイメージ出来ていないのではないでしょうか。XMLレイアウトファイルは、単なるテンプレートに過ぎません。setContentViewでXMLファイル(Rクラスの値)を指定すると、Androidのシステムは、XMLファイルを読み込み、それをもとにコンポーネントのインスタンスをnewし組み込みこんでくれる、ただそれだけのものです。ですから人によっては「XMLレイアウトファイルなんて面倒くさい」と、一切XMLを使わず、全部コードで書く人もいるくらいです。 findViewByIdは、このようにして(既に生成されている)インスタンスを取得し返すものです。別にfindViewByIdしたときにインスタンスが生成されるわけではありません。setContentViewでロードしたときに既にコンポーネント類のインスタンスは生成されていて、単に指定のインスタンスを返しているだけです。ですから、繰り返しでfindViewByIdしても、同じインスタンスが返されるだけで、いくつもインスタンスを作ったりできるわけではありません。 要するに、XMLファイルによるレイアウトの利用は、「new ○○してaddして組み込むという処理をXMLタグを書くだけでやってくれるから、いちいちJavaのコードで書くより便利でしょ?」というだけのものであって、万能ではないのです。ですから、おっしゃるように静的なXMLだけではできないようなことは、コードで書くのが基本です。XMLは単にテンプレートからインスタンスを生成するだけのものだから過剰な期待は禁物です。ダイナミックにインスタンスを操作するなら、コードでごりごり書きましょう。

kannitiha
質問者

お礼

回答ありがとうございます。 >繰り返しでfindViewByIdしても、同じインスタンスが返されるだけで、いくつもインスタンスを作ったりできるわけではありません そうなんですね。 てっきり、できるだけXMLレイアウトで書くのが一番いいと思っていたのですが、そうではないんですね。 >XMLは単にテンプレートからインスタンスを生成するだけのものだから過剰な期待は禁物です。ダイナミックにインスタンスを操作するなら、コードでごりごり書きましょう。 はい。できるだけ、コードで書くことにするようにします。 詳しい説明ありがとうございました。

その他の回答 (1)

noname#161640
noname#161640
回答No.1

よくわからないのですが、ダイナミックにコンポーネントを生成する場合は、XMLは使いません。XMLレイアウトファイルは、事前に静的にコンポーネントを配置するものですので、「書いておいたそのままにコンポーネントが作られる」という形になります。ですから、「もしTableにTextViewを3つ使いたいなら、TextViewを既に3つ記述していないと使えないもの」です。必要に応じてコンポーネントを生成するような場合は、newして組み込んでやります。そういうことですか?

kannitiha
質問者

補足

はい、イメージとしてはそうです。 その場合、newしてxmlを使いまわすことは可能なのでしょうか? 普通に、xmlレイアウトに値を入れる場合、 private TableLayout tableLayout; private TextView tv; private TableRow row; public void onCreate(Bundle icicle){ super.onCreate(icicle); setContentView(R.layout.table); tableLayout = (TableLayout) findViewById(R.id.tableLayout); row = new TableRow(this); tv = (TextView) findViewById(R.id.user); tv.setId(50); tv.setText("chanlenging"); row.addView(tv); tableLayout.addView(row); } ような形でいいのでしょうか? もし、これで、forを使う場合 row = new TableRow(this); for(int a=0;a<3;a++){ tv = (TextView) findViewById(R.id.user); tv.setId(50); tv.setText("chanlenging"); row.addView(tv); } tableLayout.addView(row); のようにして、繰り返すことはできないのでしょうか? やはり、普通にActivitiyクラスに書くのがいいのでしょうか? 宜しくお願いします。

関連するQ&A

専門家に質問してみよう