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

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

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

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

Android

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

Android Studio

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

Q&A

1回答

2288閲覧

動的に生成するオブジェクトのインスタンス名を指定したい

son000

総合スコア5

Java

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

Android

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

Android Studio

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

0グッド

1クリップ

投稿2018/04/27 08:55

編集2018/04/27 09:06

前提・実現したいこと

市区町村のapiを用いて市区町村のチェックボックスを作っています.

やりたいこと
動的に生成したチェックボックスのインスタンスの名前を指定して
チェックボックスがチェックされているかを確認したい.
以下のコードとは別にボタンを生成して
そのボタンを押したときにチェックボックスにチェックしたり
チェックを外したりしたいです.

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

生成したチェックボックスを区別できずチェック状態を確認したり チェック状態を変更したりできません.

該当のソースコード

java

for (WeatherForecast.Forecast forecast : data.forecastList) { LinearLayout.LayoutParams checkBoxLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); checkBoxLayoutParams.setMargins(100,0,0,0); **checkBox** = new CheckBox(getApplicationContext()); checkBox.setId(Integer.parseInt(forecast.id)); checkBox.setText(forecast.name); checkBox.setChecked(true); checkBox.setLayoutParams(checkBoxLayoutParams); }

試したこと

1.変数名を変数で指定しようとした
String checkName = "check" + String.ValueOf(forecast.id);
CheckBox checkName = new CheckBox(getApplicationContext());
checkNameはString型で定義済みだとお叱りを受けました
2.ネットで調べた
有力な情報が見当たらなかった
3.android studioの補完機能からそれっぽいのを探した
よくわからなかった

知りたいこと
上記のようなコードで動的にオブジェクトを生成する場合
そのインスタンス名を指定できるのか
できるなら,その方法
できないなら,idを指定することで任意のインスタンスを指定し
チェック状態を確認,変更できるのか
できないなら,他の方法はあるのか

プログラミング経験は独学で1年程度なので
誤った言葉や変な表現などがあったら申し訳ありません.
よろしくお願いします.

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

java,android studio,git

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

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

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

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

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

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

swordone

2018/04/27 09:04

タグにAndroidとかAndroid Studioとか入れておいたほうがいいですよ。
son000

2018/04/27 09:06

ありがとうございます.
guest

回答1

0

順序が前後しますが、まずCheckBoxのオブジェクトを生成するコードで

Java

1 **checkBox** = new CheckBox(getApplicationContext());

のようにコンストラクターの引数にgetApplicationContext()を渡していますが、Activityに配置するオブジェクトを生成するときは、Activityの持つContextを渡すのが一般的でしょう。このコードを記述しているのがActivityやAppComaptActivityを継承したクラスの中であるなら、

Java

1 checkbox = new CheckBox(this);

とするべきだと思います。

次に、Javaでは「コードで変数名を作る」ことはできません。ですから、できる方法で格納するしかないのですが、この場合は単なるCheckBox[]型の配列変数に格納しておくのではいけないでしょうか?

Java

1 CheckBox[] checkBox = new CheckBox[data.forecastList.size()]; 2 int i = 0; 3 4 for (WeatherForecast.Forecast forecast : data.forecastList) { 5 checkBox[i] = new CheckBox(this); 6 // 中略 7 i++; 8 }

こんな感じで。

次に、生成したCheckBoxにsetId()でIDを付与しようとされていますが、コンポーネントのIDは基本的にはAndroidの管理下にあります。動的生成したオブジェクトに対してsetId()したい場合でも、View#generateViewId()というメソッドによって発行されたIDを設定することが推奨されます。ただ、それでは「自由な値」をつけることができませんね。(まあ、自由な値を付けても動作に不都合がなければそれでいいじゃんという考えも、絶対ダメというわけではないけど)

コンポーネントに任意の名前をつけたいのであれば、IDではなくTagを使う方が良いでしょう。setTag()というメソッドでタグをつけることができます。IDはint型の数値なのでInteger.parseInt()を用いられたのでしょうが、setTag()の引数はObject型なので、いわば「何でもあり」です。forecast.idが何型なのかわかりませんが、これを下記のように直接与える形でも良いのではないでしょうか。

Java

1 checkbox[i].setTag(forecast.id);

Tagによってオブジェクトを識別するために、View#findViewWithTag()というメソッドがあります。これは、特定のViewの子Viewの中から、引数に指定したTagに一致するオブジェクトを探すものです。提示されたコードが断片的なので不明な部分がありますが、生成したCheckBoxは予め用意されたLinearLayoutの中に配置されるのでしょうかね?(そのLinearLayoutも動的生成?)

layoutという変数にCheckBoxを収めるLinearLayoutへの参照が入っているものとして、

Java

1 CheckBox checkBox = layout.findViewWithTag(forecast.id); 2 if (checkBox != null) { 3 // タグに一致したCheckBoxに対する処理を記述 4 }

といった感じでforecast.idによってCheckBoxを特定してそれに対して処理をするという記述は可能でしょう。

断片的な情報のみで参考にするには難しいかもしれませんが、とりあえず出せる情報として記してみました。

投稿2018/04/28 11:16

編集2018/04/28 11:48
keicha_hrs

総合スコア6768

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

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

退会済みユーザー

退会済みユーザー

2018/04/28 11:30

マップという疑似的なものがあるじゃろ
keicha_hrs

2018/04/29 05:33

マ、マップも頭になかったわけではないんですが・・・(本当か?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問