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

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

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

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

Android

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

4458閲覧

Randomで出た画像を配列の中から表示したい

mari_tom

総合スコア12

Java

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

Android

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2015/06/19 11:48

編集2015/06/19 14:00

gat~gat6までのImageViewに、それぞれRandomクラスで出た変数rの数に応じて、4つある配列のうち1つの配列を選び、
その配列のうち1枚の画像を表示する、という事を6回繰り返すプログラムを組もうとしています
しかし『java.lang.Iterable の配列またはインスタンスのみ繰り返すことができます』というエラーが出てしまい、
それを消すには何というコードを入れれば良いのでしょうか
また、意図した通りにコードを動かすにあたって他にコードの間違いがありましたらご指摘をお願いします

lang

1package jp.example.wgamen; 2 3import java.util.Random; 4 5import android.app.Activity; 6import android.content.Intent; 7import android.content.res.TypedArray; 8import android.os.Bundle; 9import android.view.View; 10import android.widget.Button; 11import android.widget.ImageView; 12 13public class SubActivity extends Activity { 14 15 ImageView gat; 16 ImageView gat2; 17 ImageView gat3; 18 ImageView gat4; 19 ImageView gat5; 20 ImageView gat6; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.sub); 26 27 // 画面に配置したImageViewを設定 28 gat = (ImageView)findViewById(R.id.v1); 29 gat2 = (ImageView)findViewById(R.id.v2); 30 gat3 = (ImageView)findViewById(R.id.v3); 31 gat4 = (ImageView)findViewById(R.id.v4); 32 gat5 = (ImageView)findViewById(R.id.v5); 33 gat6 = (ImageView)findViewById(R.id.v6); 34 35 //整数を入れる為の変数を宣言 36 int gatya2; 37 38 39 // 画像のリストを取得 40 TypedArray images = getResources().obtainTypedArray(R.array.r); 41 TypedArray images2 = getResources().obtainTypedArray(R.array.sr); 42 TypedArray images3 = getResources().obtainTypedArray(R.array.ur); 43 TypedArray images4 = getResources().obtainTypedArray(R.array.lr); 44 45 // Randomクラスのインスタンスを生成 46 Random r = new Random(); 47 48 //0以上100未満の整数の乱数を作成する 49 gatya2 = r.nextInt(100); 50 51 //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する 52 if(gatya2 <= 2){ 53 gat.setImageResource(R.array.lr); 54 55}else 56 //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する 57 if(gatya2 <= 12){ 58 gat.setImageResource(R.array.ur); 59}else 60 //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する 61 if(gatya2 <= 39){ 62 gat.setImageResource(R.array.sr); 63}else{ 64 //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する 65 gat.setImageResource(R.array.r); 66} 67 68//2~5まで繰り返しなので省略・ 69 70 //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する 71 if(gatya2 <= 2){ 72 gat6.setImageResource(R.array.lr); 73}else 74 //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する 75 if(gatya2 <= 12){ 76 gat6.setImageResource(R.array.ur); 77}else 78 //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する 79 if(gatya2 <= 39){ 80 gat6.setImageResource(R.array.sr); 81}else{ 82 //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する 83 gat6.setImageResource(R.array.r); 84} 85 86 // 各ImageViewに画像を設定 ↓ここで?の部分に何を入れればいいか分からずエラーが出ます 87 for(ImageView tmp : ?) 88 { 89 tmp.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); 90 tmp.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); 91 tmp.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); 92 tmp.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); 93 } 94

よろしくお願いします

追記:回答下さった皆様のおかげで、今こういうコードになっています

lang

1package jp.example.wgamen; 2 3import java.util.Arrays; 4import java.util.Random; 5 6import android.annotation.SuppressLint; 7import android.app.Activity; 8import android.content.Intent; 9import android.content.res.TypedArray; 10import android.os.Bundle; 11import android.view.View; 12import android.widget.Button; 13import android.widget.ImageView; 14 15public class SubActivity extends Activity { 16 17 ImageView gat; 18 ImageView gat2; 19 ImageView gat3; 20 ImageView gat4; 21 ImageView gat5; 22 ImageView gat6; 23 24 @SuppressLint("Recycle") 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.sub); 29 30 // 画面に配置したImageViewを設定 31 gat = (ImageView)findViewById(R.id.v1); 32 gat2 = (ImageView)findViewById(R.id.v2); 33 gat3 = (ImageView)findViewById(R.id.v3); 34 gat4 = (ImageView)findViewById(R.id.v4); 35 gat5 = (ImageView)findViewById(R.id.v5); 36 gat6 = (ImageView)findViewById(R.id.v6); 37 38 //整数を入れる為の変数を宣言 39 int gatya2; 40 41 42 // 画像のリストを取得 43 TypedArray images = getResources().obtainTypedArray(R.array.r); 44 TypedArray images2 = getResources().obtainTypedArray(R.array.sr); 45 TypedArray images3 = getResources().obtainTypedArray(R.array.ur); 46 TypedArray images4 = getResources().obtainTypedArray(R.array.lr); 47 48 // Randomクラスのインスタンスを生成 49 Random r = new Random(); 50 51 for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) { 52 //0以上100未満の整数の乱数を作成する 53 gatya2 = r.nextInt(100); 54 //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する 55 if(gatya2 <= 2){ 56 gat.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); 57 //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する 58 }else if(gatya2 <= 12){ 59 gat.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); 60 //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する 61 }else if(gatya2 <= 39){ 62 gat.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); 63 //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する 64 }else{ 65 gat.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); 66 } 67//gat2~gat5まで同じなので省略 68 if(gatya2 <= 2){ 69 gat6.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); 70 }else if(gatya2 <= 12){ 71 gat6.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); 72 }else if(gatya2 <= 39){ 73 gat6.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); 74 }else{ 75 gat6.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); 76 } 77 } 78

かなり完成度が高いコードになったと思うのですが、何故か強制終了してしまいます
何度もコードを読み返しているのですが、何が原因なのか分かりません
気になる所といえば、for(ImageView tmp : のtmpに『ローカル変数tmpの値は使用されていません』という警告が出ている事くらいです

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

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

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

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

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

guest

回答2

0

ベストアンサー

多分やりたいのはこういうことですかね?
Random r = new Random();の行の次からとお考え下さい.

lang

1for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) { 2 //各ImageViewに対して乱数を振り、その結果でDrawableを取り出す配列を決定 3 gatya2 = r.nextInt(100); 4 TypedArray array = null; 5 if(gatya2 <= 2){ 6 array = images4; 7 }else if(gatya2 <= 12){ 8 array = images3; 9 }else if(gatya2 <= 39){ 10 array = images2; 11 }else{ 12 array = images; 13 } 14 //決定した配列の長さから乱数を生成し,それをインデックスにDrawableを取り出しセット 15 //(ここは個人的に括弧が重なりすぎて読みにくかったため分解) 16 int i = r.nextInt(array.length()); 17 tmp.setImageDrawable(array.getDrawable(i)); 18}

投稿2015/06/19 13:36

編集2015/06/19 14:00
swordone

総合スコア20651

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

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

mari_tom

2015/06/19 14:03

ありがとうございます!なるほどそう書けばrやsrやurからもちゃんと画像が出るようになりますね! 早速コードをそのように書き換えて実行したのですが、何故か強制終了してしまいます エラーなどは特に出ていないのですが…原因が他にある事も十分に考えられるので、もう一度書いたコードを見直してきます
swordone

2015/06/19 14:06

強制終了の原因はたいてい何かしらの例外発生で,その例外のログがLogcatに出ているはずです.それを貼って下さい.
swordone

2015/06/19 14:25

追記したコードですが,これでは修正前のコード(6種のgat*に配列から引き出しセット)をただ6周してるだけのコードです.しかも1周ごとにgatya2の値を共用してるので,引き出し元の配列は同じになってしまいます.
mari_tom

2015/06/19 14:40

お待たせしてしみません、LogcatのERRORメッセージがあまりにも多く、どれが原因なのか分からないので、全て貼らせていただきます 06-19 23:31:26.910: E/InputDispatcher(5423): Motion event has invalid pointer count 0; value must be between 1 and 16. 06-19 23:31:26.990: E/InputDispatcher(5423): Motion event has invalid pointer count 0; value must be between 1 and 16. 06-19 23:31:27.160: E/EmojiFactory_jni(5423): Failed to load libemoji.so: dlopen failed: library "libemoji.so" not found 06-19 23:31:27.180: E/Sensor-AccelerometerUI(5600): java.io.IOException: Connection refused 06-19 23:31:28.820: E/InputDispatcher(5423): Motion event has invalid pointer count 0; value must be between 1 and 16. 06-19 23:31:28.910: E/InputDispatcher(5423): Motion event has invalid pointer count 0; value must be between 1 and 16. 06-19 23:31:28.980: E/AndroidRuntime(6967): in writeCrashedAppName, pkgName :jp.example.wgamen 06-19 23:31:28.980: E/AndroidRuntime(6967): FATAL EXCEPTION: main 06-19 23:31:28.980: E/AndroidRuntime(6967): Process: jp.example.wgamen, PID: 6967 06-19 23:31:28.980: E/AndroidRuntime(6967): java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.example.wgamen/jp.example.wgamen.SubActivity}: java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.ActivityThread.access$800(ActivityThread.java:135) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.os.Handler.dispatchMessage(Handler.java:102) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.os.Looper.loop(Looper.java:136) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.ActivityThread.main(ActivityThread.java:5021) 06-19 23:31:28.980: E/AndroidRuntime(6967): at java.lang.reflect.Method.invokeNative(Native Method) 06-19 23:31:28.980: E/AndroidRuntime(6967): at java.lang.reflect.Method.invoke(Method.java:515) 06-19 23:31:28.980: E/AndroidRuntime(6967): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 06-19 23:31:28.980: E/AndroidRuntime(6967): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 06-19 23:31:28.980: E/AndroidRuntime(6967): at dalvik.system.NativeStart.main(Native Method) 06-19 23:31:28.980: E/AndroidRuntime(6967): Caused by: java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView 06-19 23:31:28.980: E/AndroidRuntime(6967): at jp.example.wgamen.SubActivity.onCreate(SubActivity.java:36) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.Activity.performCreate(Activity.java:5231) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090) 06-19 23:31:28.980: E/AndroidRuntime(6967): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 06-19 23:31:28.980: E/AndroidRuntime(6967): ... 11 more 06-19 23:31:29.120: E/AndroidRuntime(6985): in writeCrashedAppName, pkgName :jp.example.wgamen 06-19 23:31:29.140: E/AndroidRuntime(6985): FATAL EXCEPTION: main 06-19 23:31:29.140: E/AndroidRuntime(6985): Process: jp.example.wgamen, PID: 6985 06-19 23:31:29.140: E/AndroidRuntime(6985): java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.example.wgamen/jp.example.wgamen.SubActivity}: java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.ActivityThread.access$800(ActivityThread.java:135) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.os.Handler.dispatchMessage(Handler.java:102) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.os.Looper.loop(Looper.java:136) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.ActivityThread.main(ActivityThread.java:5021) 06-19 23:31:29.140: E/AndroidRuntime(6985): at java.lang.reflect.Method.invokeNative(Native Method) 06-19 23:31:29.140: E/AndroidRuntime(6985): at java.lang.reflect.Method.invoke(Method.java:515) 06-19 23:31:29.140: E/AndroidRuntime(6985): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 06-19 23:31:29.140: E/AndroidRuntime(6985): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 06-19 23:31:29.140: E/AndroidRuntime(6985): at dalvik.system.NativeStart.main(Native Method) 06-19 23:31:29.140: E/AndroidRuntime(6985): Caused by: java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView 06-19 23:31:29.140: E/AndroidRuntime(6985): at jp.example.wgamen.SubActivity.onCreate(SubActivity.java:36) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.Activity.performCreate(Activity.java:5231) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090) 06-19 23:31:29.140: E/AndroidRuntime(6985): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 06-19 23:31:29.140: E/AndroidRuntime(6985): ... 11 more 06-19 23:31:29.210: E/AndroidRuntime(6998): in writeCrashedAppName, pkgName :jp.example.wgamen 06-19 23:31:29.210: E/AndroidRuntime(6998): FATAL EXCEPTION: main 06-19 23:31:29.210: E/AndroidRuntime(6998): Process: jp.example.wgamen, PID: 6998 06-19 23:31:29.210: E/AndroidRuntime(6998): java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.example.wgamen/jp.example.wgamen.SubActivity}: java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.ActivityThread.access$800(ActivityThread.java:135) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.os.Handler.dispatchMessage(Handler.java:102) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.os.Looper.loop(Looper.java:136) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.ActivityThread.main(ActivityThread.java:5021) 06-19 23:31:29.210: E/AndroidRuntime(6998): at java.lang.reflect.Method.invokeNative(Native Method) 06-19 23:31:29.210: E/AndroidRuntime(6998): at java.lang.reflect.Method.invoke(Method.java:515) 06-19 23:31:29.210: E/AndroidRuntime(6998): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 06-19 23:31:29.210: E/AndroidRuntime(6998): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 06-19 23:31:29.210: E/AndroidRuntime(6998): at dalvik.system.NativeStart.main(Native Method) 06-19 23:31:29.210: E/AndroidRuntime(6998): Caused by: java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView 06-19 23:31:29.210: E/AndroidRuntime(6998): at jp.example.wgamen.SubActivity.onCreate(SubActivity.java:36) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.Activity.performCreate(Activity.java:5231) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090) 06-19 23:31:29.210: E/AndroidRuntime(6998): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 06-19 23:31:29.210: E/AndroidRuntime(6998): ... 11 more
mari_tom

2015/06/19 14:42

追記のコードについてもご指摘ありがとうございます!gatya2以外の変数を作りそれぞれに振り分けてきます!
swordone

2015/06/19 14:46

java.lang.ClassCastException: android.widget.Button cannot be cast to android.widget.ImageView findViewByIdで持ってきたビューのどれかが実はButtonで,それをImageViewにキャストしようとした事による例外です. at jp.example.wgamen.SubActivity.onCreate(SubActivity.java:36) SubActivity.javaの36行目と言っていますが,36行目で扱っているViewを確認して下さい.
mari_tom

2015/06/19 14:58

ありがとうございます!確かに画像の下に戻るボタンのコードも書いていたので何か関係があるのでしょうか… 36行目を確認したら gat5 = (ImageView)findViewById(R.id.v5); でした ちなみにボタンのコードはこうなっています↓ //ボタンクリックイベントリスナー btn = (Button) findViewById(R.id.sub_button); btn.setOnClickListener(new View.OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //インテントに、この画面を指定する Intent intent = new Intent(); //戻り値設定 setResult(RESULT_OK, intent); //サブ画面終了 finish(); } });
swordone

2015/06/19 15:06

レイアウトxmlに設定しているidは正しいですか? NO:コードのR.id.**に合うように修正して下さい YES:一旦そのレイアウトxmlのソースをすべて「切り取り」し,「プロジェクト」>「プロジェクトのビルド」(または「すべてビルド」) その後,切り取ったソースを「貼り付け」し,「プロジェクト」>「プロジェクトのビルド」(または「すべてビルド」) YESのパターンは,レイアウトxmlを書いたあとレイアウトパーツをドラッグ&ドロップすると起こりえます(実体験).
mari_tom

2015/06/19 15:29

ありがとうございます!YESだったのでその通りにしましたら、今度はat jp.example.wgamen.SubActivity.onCreate(SubActivity.java:34)というエラーが出て強制終了しました 34行目のコードは gat3 = (ImageView)findViewById(R.id.v3);で、これまたYESなのでもう一度同じ事を繰り返しましたところ、今度はat jp.example.wgamen.SubActivity.onCreate(SubActivity.java:35)とエラーが出て、また強制終了しました こうなったらエラーが出なくなるまで切り貼りビルドを繰り返してみようと思います!
mari_tom

2015/06/19 15:34

ありがとうございます!もう一度切り取り→ビルド→貼り付け→ビルド→実行、で強制終了する事はなくなり、ちゃんとrからlrまでランダムに画像を表示させる事ができました!! 本当にありがとうございました!!
swordone

2015/06/19 16:16

なんか私がキャスト例外を指摘する前のコメントと追記のコードを見てると,貴方がループの部分で勘違いしているような気がしてならないのですが・・・
mari_tom

2015/06/20 11:31

すみません、数回テストしたらちゃんと思い通りに動いてくれたので浮かれてしまいました; コードの全容はpackage jp.example.wgamen; import java.util.Arrays; import java.util.Random; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.res.TypedArray; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class SubActivity extends Activity { private Button btn; ImageView gat; ImageView gat2; ImageView gat3; ImageView gat4; ImageView gat5; ImageView gat6; @SuppressLint("Recycle") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sub); // 画面に配置したImageViewを設定 gat = (ImageView)findViewById(R.id.v1); gat2 = (ImageView)findViewById(R.id.v2); gat3 = (ImageView)findViewById(R.id.v3); gat4 = (ImageView)findViewById(R.id.v4); gat5 = (ImageView)findViewById(R.id.v5); gat6 = (ImageView)findViewById(R.id.v6); //整数を入れる為の変数を宣言 int gatya1; int gatya2; int gatya3; int gatya4; int gatya5; int gatya6; // 画像のリストを取得 TypedArray images = getResources().obtainTypedArray(R.array.r); TypedArray images2 = getResources().obtainTypedArray(R.array.sr); TypedArray images3 = getResources().obtainTypedArray(R.array.ur); TypedArray images4 = getResources().obtainTypedArray(R.array.lr); // Randomクラスのインスタンスを生成 Random r = new Random(); for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) { //0以上100未満の整数の乱数を作成する gatya1 = r.nextInt(100); //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する if(gatya1 <= 2){ gat.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する }else if(gatya1 <= 12){ gat.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する }else if(gatya1 <= 39){ gat.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する }else{ gat.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); } //0以上100未満の整数の乱数を作成する gatya2 = r.nextInt(100); //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する if(gatya2 <= 2){ gat2.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する }else if(gatya2 <= 12){ gat2.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する }else if(gatya2 <= 39){ gat2.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する }else{ gat2.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); } //0以上100未満の整数の乱数を作成する gatya3 = r.nextInt(100); //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する if(gatya3 <= 2){ gat3.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する }else if(gatya3 <= 12){ gat3.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する }else if(gatya3 <= 39){ gat3.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する }else{ gat3.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); } //0以上100未満の整数の乱数を作成する gatya4 = r.nextInt(100); //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する if(gatya4 <= 2){ gat4.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する }else if(gatya4 <= 12){ gat4.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する }else if(gatya4 <= 39){ gat4.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する }else{ gat4.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); } //0以上100未満の整数の乱数を作成する gatya5 = r.nextInt(100); //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する if(gatya5 <= 2){ gat5.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する }else if(gatya5 <= 12){ gat5.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する }else if(gatya5 <= 39){ gat5.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する }else{ gat5.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); } //0以上100未満の整数の乱数を作成する gatya6 = r.nextInt(100); //ランダムで出た数が2以下ならLRの配列から1枚画像を表示する if(gatya6 <= 2){ gat6.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); //ランダムで出た数が3以上12以下ならURの配列から1枚画像を表示する }else if(gatya6 <= 12){ gat6.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); //ランダムで出た数が13以上39以下ならSRの配列から1枚画像を表示する }else if(gatya6 <= 39){ gat6.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); //それ以外(それ以降)の数字ならRの配列から1枚画像を表示する }else{ gat6.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); } } //ボタンクリックイベントリスナー btn = (Button) findViewById(R.id.sub_button); btn.setOnClickListener(new View.OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //インテントに、この画面を指定する Intent intent = new Intent(); //戻り値設定 setResult(RESULT_OK, intent); //サブ画面終了 finish(); } }); } } です
swordone

2015/06/20 11:55

コード内のコメントが誤解を与えたのなら申し訳ないのですが, 「各ImageViewに対して乱数を振る」というのは,forによって順番にImageViewが取り出されるわけですが,そのそれぞれに対して乱数を振る,という意味です. 私の回答のコードでそれは満たされているのですが,あなたの書き方だと,「それぞれに対して乱数を振り,画像をセットする」この動作が6回繰り返されます. はっきり言って,かなり無駄が多いです.
swordone

2015/06/20 12:04

端的に言うと,貴方が最初のコードで //2~5まで繰り返しなので省略・ と言っていた部分と,1番目,6番目も含めた部分を私が書いたfor文で解決しています.
mari_tom

2015/06/20 13:04

いえ、こちらの読解力や知識が欠けており、間違って解釈してコードを書いてしまったようで、すみませんでした。 もっとコードをすっきりと簡潔に書く事ができるのですね、考えもしませんでした。 それぞれに乱数を振るだけで良く、画像をセットするコードは不要なんですね。ご指摘いただくまで全く気が付きませんでした… これで良いのでしょうか? for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) { //0以上100未満の整数の乱数を作成する gatya1 = r.nextInt(100); TypedArray array = null; if(gatya1 <= 2){ array = images4; }else if(gatya1 <= 12){ array = images3; }else if(gatya1 <= 39){ array = images2; }else{ array = images; } //決定した配列の長さから乱数を生成し,それをインデックスにDrawableを取り出しセット //(ここは個人的に括弧が重なりすぎて読みにくかったため分解) int i = r.nextInt(array.length()); tmp.setImageDrawable(array.getDrawable(i)); //2~5まで省略 gatya6 = r.nextInt(100); TypedArray array6 = null; if(gatya6 <= 2){ array6 = images4; }else if(gatya6 <= 12){ array6 = images3; }else if(gatya6 <= 39){ array6 = images2; }else{ array6 = images; } int i6 = r.nextInt(array6.length()); tmp.setImageDrawable(array6.getDrawable(i6)); } これで実行しましたら、これもちゃんと動いてくれました。
swordone

2015/06/20 13:16

for文の意味を理解しなおしたほうが良いかと. for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) これはgat~gat6までをList化して拡張for文で使えるようにし, 一個ずつ取り出してループする文です. 私のコードでは,まずtmp=gatとなり,forブロックの中の文が実行されます. 最後の行でtmp.setImageDrawable(array6.getDrawable(i6));がありますが, ここでtmp=gatなので,これはgatに対して画像セットの動作をしています. ここで1ループ終わります. 次にtmp=gat2となり,forブロックの中の文が実行されます. 最後の行はtmp=gat2なので,gat2に対する操作です. こうしてループして,gat~gat6それぞれにランダムに画像セットしています. あなたのコードは, まずtmp=gatにして,「乱数を振り,リストを決め,画像をセット」というこの一連の操作を"tmp=gatに対して計6回"行っています.これが1ループです. それをgat~gat6それぞれに行っていて,大変無駄です.
mari_tom

2015/06/20 13:39

何度もお手を煩わせてしまってすみません。もう一度考え直したらかなり簡略化できました! //整数を入れる為の変数を宣言 int gatya1; // 画像のリストを取得 TypedArray images = getResources().obtainTypedArray(R.array.r); TypedArray images2 = getResources().obtainTypedArray(R.array.sr); TypedArray images3 = getResources().obtainTypedArray(R.array.ur); TypedArray images4 = getResources().obtainTypedArray(R.array.lr); // Randomクラスのインスタンスを生成 Random r = new Random(); for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) { //0以上100未満の整数の乱数を作成する gatya1 = r.nextInt(100); TypedArray array = null; if(gatya1 <= 2){ array = images4; }else if(gatya1 <= 12){ array = images3; }else if(gatya1 <= 39){ array = images2; }else{ array = images; } //決定した配列の長さから乱数を生成し,それをインデックスにDrawableを取り出しセット //(ここは個人的に括弧が重なりすぎて読みにくかったため分解) int i = r.nextInt(array.length()); tmp.setImageDrawable(array.getDrawable(i)); } これだけでも実行したらv1~v6それぞれにランダムで画像が表示されていました! 改めて自分の至らなさを痛感したので、もう一度for文をはじめとするJavaの基礎から学び直そうと思います。 本当に失礼をいたしました。
guest

0

拡張for文の?の部分には、java.lang.Iterableの実装クラスか、配列を指定します。
java.lang.Iterableの実装クラスとは、例えばListなどのコレクションです。

この場合は、gatgat6の6つのImageViewjava.lang.Iterableの実装クラスか、配列に格納して、それを?に指定します。これはArrays.asList()を使うのが簡単だと思います。

lang

1// import java.util.Arrays 2 3for(ImageView tmp : Arrays.asList(gat, gat2, gat3, gat4, gat5, gat6)) { 4}

投稿2015/06/19 12:00

argius

総合スコア9388

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

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

mari_tom

2015/06/19 12:19

ありがとうございます!教えていただいた通りにしましたらエラーが消えました! ただ実行してみたら、何故か一番低確率のはずの配列lrからしか画像が出ません… rやsr、urも交えたRandomにするには何が間違っているのでしょうか? // 画像のリストを取得の所のobtainTypedArrayに『This TypedArray should be recycled after use with #recycle()』という警告が出ています
argius

2015/06/19 12:42

gatya2 = r.nextInt(100);したあとのgatya2の値がどうなっているか分かりますか? その値が毎回0,1,2になっているのならRandomの問題かも知れません。そうでなければ、それ以外の箇所に問題がある可能性があります。 obtainTypedArrayの警告は、TypedArrayは使い終わったらrecycle()メソッドで破棄すべき、という意味です。
mari_tom

2015/06/19 13:19

警告の意味を教えていただいてありがとうございます! gatya2の値を表示して確認しようとソースを下記のように書いたら、強制終了してしまい、結局gatya2の値がどうなっているのか確認できませんでした、すみません // Randomクラスのインスタンスを生成 Random r = new Random(); //0以上100未満の整数の乱数を作成する gatya2 = r.nextInt(100); System.out.println(gatya2); もう一度、書いたソースを見直してきます
swordone

2015/06/19 13:20

setImageResource(R.array.***)で何をやっているか不明ですが, for(ImageView tmp : ?) { tmp.setImageDrawable(images.getDrawable(r.nextInt(images.length()))); tmp.setImageDrawable(images2.getDrawable(r.nextInt(images2.length()))); tmp.setImageDrawable(images3.getDrawable(r.nextInt(images3.length()))); tmp.setImageDrawable(images4.getDrawable(r.nextInt(images4.length()))); } lrはimages4なので,このループを実行すると最後の行の結果だけが各ImageViewに残るので,lrからしか出ないのは当然です.
argius

2015/06/19 13:23

swordoneさん あれ、本当ですね。全部tmpになってるんですね。すみません、勘違いしてました。
mari_tom

2015/06/19 13:38

swordoneさん、ありがとうございます! 自分の書き方だと最後の行の結果しか出なくなってしまうんですね… lrだけでなくrやSR、urからも画像が出るようにするには、どのようにコードを書き換えたら良いのでしょうか… もう少し自分でも考えてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問