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

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

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

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

Android Emulator

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

Q&A

解決済

1回答

9271閲覧

[AndroidStudio]エミュレータ上で画面遷移すると落ちてしまう

RunningReo

総合スコア6

Android

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

Android Emulator

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

0グッド

0クリップ

投稿2020/10/01 05:44

Androidstudioにて、以下のソースコードをビルドしました。

無事に完了したのですが、以下のtitle1ActivityからbusinessActivityへの画面遷移を実際にエミュレータ上で試してみると、画面が強制終了してしまいます。

コンピュータの使用率も、それほど限界に来しているわけでもなく、最後の画面遷移(//★)title1Activityからtitle2Activityへの画面遷移は上手くいっています。

何故上手くいかないのでしょうかご教授お願い致します。

package jp.wings.nikkeibp.quizapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class title1Activity extends AppCompatActivity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_title1); Button businessAndlegal = findViewById(R.id.businessandlegal); businessAndlegal.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(),businessActivity.class); startActivity(intent); } }); Button nextpageButton = findViewById(R.id.nextpage); nextpageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(),title2Activity.class); startActivity(intent); } }); }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

コード上におかしな点は見当たりません。それでも画面遷移でアプリが落ちるとしたら、AndroidManifest.xmlに

xml

1 <activity android:name=".businessActivity" />

の記述がないのではないでしょうか。この記述も存在するのにやはり落ちるのだとしたら、businessActivityが描画されるときの記述に問題がある可能性がありますが、それを調べるためにはbusinessActivityのソースとアプリが落ちたときのLogCatのスタックトレース(赤字で大量に表示されるエラーメッセージ)をご提示いただく必要があるでしょう。


質問は編集できるので、今後はコードやログの追加提示は質問編集で加えてください。

LogCatは端末やエミュレーターによって出力されたログを表示するツールのことで、Android Studioの左下の方にLogCatと記されたタブをクリックしてビューを開くことで閲覧することができます。これを開いた状態でアプリを実行して落ちたときに、赤字で10行以上に渡ってメッセージが表示されているはずです。これを見ることでどのソースの何行目で何の要因で落ちたのかを調べることができます。

LogCat

ご提示いただいたbusinessActivity.javaのコードを再現したところ、落ちる現象を確認できました。このとき、LogCatには次のようなエラーログが出力されていました。

text

12020-10-04 16:36:04.088 10362-10362/jp.wings.nikkeibp.quizapp E/AndroidRuntime: FATAL EXCEPTION: main 2 Process: jp.wings.nikkeibp.quizapp, PID: 10362 3 java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.wings.nikkeibp.quizapp/jp.wings.nikkeibp.quizapp.businessActivity}: java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 4 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) 5 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 6 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 7 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 8 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 9 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 10 at android.os.Handler.dispatchMessage(Handler.java:107) 11 at android.os.Looper.loop(Looper.java:214) 12 at android.app.ActivityThread.main(ActivityThread.java:7356) 13 at java.lang.reflect.Method.invoke(Native Method) 14 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 15 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 16 Caused by: java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 17 at java.util.ArrayList.get(ArrayList.java:437) 18 at jp.wings.nikkeibp.quizapp.businessActivity.showNextQuiz1(businessActivity.java:88) 19 at jp.wings.nikkeibp.quizapp.businessActivity.onCreate(businessActivity.java:66) 20 at android.app.Activity.performCreate(Activity.java:7802) 21 at android.app.Activity.performCreate(Activity.java:7791) 22 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 23 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 24 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)  25 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)  26 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  27 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  28 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)  29 at android.os.Handler.dispatchMessage(Handler.java:107)  30 at android.os.Looper.loop(Looper.java:214)  31 at android.app.ActivityThread.main(ActivityThread.java:7356)  32 at java.lang.reflect.Method.invoke(Native Method)  33 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)  34 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

これにより、businessActivity.javaの88行目でIndexOutOfBoundsExceptionという例外が発生していることがわかります。当該行付近を調べると、

java

1 quiz1.remove(0); // 0をremoveしたのでこの時点で0〜2のリストに 2 3 Collections.shuffle(quiz1); 4 5 answerBtn1_1.setText(quiz1.get(1)); 6 answerBtn1_2.setText(quiz1.get(2)); 7 answerBtn1_3.setText(quiz1.get(3)); // ここが88行目(3は存在しない) 8 answerBtn1_4.setText(quiz1.get(4));

のようになっていました。変数quiz1は配列quizData1から得た文字列を挿入したリストになっていますが、~~quizData1の定義では4×5の二次元配列になっているのに、~~ループでtempra1というリストにquizData1から読み込んだデータを積むときに、quizData1[i][0]〜quizData1[i][3]までの4つしか積まれていません。まずここが誤りではないでしょうか。それを格納したリストから1つremove()してしまったら3つに減ってしまいますね。さらに、get()するときのインデックスは0から始まるので、元々は0〜3のリスト、そこから1つremoveしてしまったので0〜2のリストに変化しています。ところが、88行目では3を指定しました。3は存在しませんから、範囲外指定をしたものとしてIndexOutOfBoundsExceptionが発生してアプリが落ちているようです。(回答修正)


下図はデバッグ実行してエラーが起きる直前で止めたときの様子です。リストquiz1には0、1、2の3つの要素しかないことがわかります。ここでget(3)を行おうとすると、範囲外指定のエラーで落ちます。

リストの様子

投稿2020/10/01 08:22

編集2020/10/08 08:18
keicha_hrs

総合スコア6768

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

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

RunningReo

2020/10/04 01:03

businessActivityのソースはこちらです。LogCat?がどういったものか分からなくて提示できないのですが、ご覧ください。 package jp.wings.nikkeibp.quizapp; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collections; import java.util.Random; public class businessActivity extends AppCompatActivity { private TextView countLabel_1; private TextView questionLabel_1; private Button answerBtn1_1; private Button answerBtn1_2; private Button answerBtn1_3; private Button answerBtn1_4; private String rightAnswer1; private int rightAnswerCount1 = 0; private int quizCount1 = 1; static private int Quiz_Count1 = 5;//恐らくここで、問題数を指定できる。具体的に説明すると、何問で結果画面に遷移するのかをコーディング。 ArrayList<ArrayList<String>> FEquestion1 = new ArrayList<>(); String quizData1[][] = { {"経営資源とは?","人物金情報","根本的改善","人材管理","生活改善",}, {"","","","","",}, {"","","","","",}, {"","","","","",}, {"","","","","",}, }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.business_and_legal_affairs); countLabel_1 = findViewById(R.id.countLabel_1); questionLabel_1 = findViewById(R.id.questionLabel_1); answerBtn1_1 = findViewById(R.id.answerBtn1_1); answerBtn1_2 = findViewById(R.id.answerBtn1_2); answerBtn1_3 = findViewById(R.id.answerBtn1_3); answerBtn1_4 = findViewById(R.id.answerBtn1_4); for(int i = 0; i < quizData1.length; i++) { ArrayList<String> tempra1 = new ArrayList<>(); tempra1.add(quizData1[i][0]); tempra1.add(quizData1[i][1]); tempra1.add(quizData1[i][2]); tempra1.add(quizData1[i][3]); FEquestion1.add(tempra1); } showNextQuiz1(); }; public void showNextQuiz1() { countLabel_1.setText("Q"+quizCount1); Random random = new Random(); int randNum1 = random.nextInt(FEquestion1.size()); ArrayList<String> quiz1 = FEquestion1.get(randNum1); questionLabel_1.setText(quiz1.get(0)); rightAnswer1 = quiz1.get(1); quiz1.remove(0); Collections.shuffle(quiz1); answerBtn1_1.setText(quiz1.get(1)); answerBtn1_2.setText(quiz1.get(2)); answerBtn1_3.setText(quiz1.get(3)); answerBtn1_4.setText(quiz1.get(4)); FEquestion1.remove(randNum1); } public void checkAnswer(View view) { Button answerBtn1 = findViewById(view.getId()); String btmtext1 = answerBtn1.getText().toString(); String alertTitle_1; if (btmtext1.equals(rightAnswer1)) { alertTitle_1 = "大正解"; rightAnswerCount1++; } else { alertTitle_1 = "不正解!"; } AlertDialog.Builder builder1 = new AlertDialog.Builder(this); builder1.setTitle(alertTitle_1); builder1.setMessage("答え"+rightAnswerCount1); builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { if(quizCount1==Quiz_Count1) { Intent intent = new Intent(getApplicationContext(),resultActivity.class); intent.putExtra("RIGHT_ANSWER_COUNT",rightAnswerCount1); startActivity(intent); }else{ quizCount1++; showNextQuiz1(); } } }); builder1.setCancelable(false); builder1.show(); } }
RunningReo

2020/10/08 00:54

ご回答ありがとうございます。logcatの説明もありがとうございます。んー、まだ理解できていません。 >quizData1の定義では4×5の二次元配列になっている ここは、5×5ではないですか?
keicha_hrs

2020/10/08 08:28 編集

配列quizData1は5×5でしたね。そこは失礼しました。ただ、リストには5つ積まれていません。ループでtempra1というリストにquizData1から読み込んだデータを積んでいますが、quizData1[i][3]までしか積んでいませんよね。まず、これが誤りではないのでしょうか?それから、リストからremoveすると他の要素が前詰めされますので、リストに残るのは0、1、2の3つになります。そこでget(3}を行おうとしているためにエラーで落ちています。それはこちらでもデバッガを使って確認しています。(回答に画像追加)
RunningReo

2020/10/09 01:40

懇切丁寧にありがとうございます。。理解することができました。そして、実行まで完了しました。 しかし、もう一つ人から教わったコードなので、理解してないところがあるのでそちらもご教授お願いしたいです。 >FEquestion1.add(tempra1); ここで、quizDataが格納されている一次元配列のtempra1を二次元配列のFEquestion1に追加していますが、これはFEquestion1を一次元配列として用いているのでしょうか?そうだとしたら、無駄な処理だなと思い、気になって質問させていただきました。
keicha_hrs

2020/10/09 15:05

FEquestion1は「問題と4つの解答選択肢という5つの要素が格納されたリスト」をさらに格納するための二次元リストとして扱っていると思います。FEquestion1から一つ要素を取り出せば、前述の「」内の情報を得られる仕組みにしているようです。ループでFEquestion1にadd()しているのはその初期処理のためのものですから、「無駄な処理」ではないと思います。1問完了する度にFEquestion1からその問題をremove()していますから、全問終了すればFEquestion1は空っぽになるという流れになるのでしょう。
RunningReo

2020/10/10 00:08

>FEquestion1は「問題と4つの解答選択肢という5つの要素が格納されたリスト」 なるほど、ありがとうございます! つまり、一回目のFEquestion.add(tempra1)で、tempra1がFEquestionの[0][0]、二回目で[1][0]、三回目で[2][0]・・・と縦にどんどん格納されているという理解で合っていますでしょうか?
keicha_hrs

2020/10/10 12:19

まあ、だいたいそのような解釈でいいと思います。問題数分FEquestion積んだ後にshowNextQuiz1()メソッドを呼び出して、その序盤で Random random = new Random(); int randNum1 = random.nextInt(FEquestion1.size()); ArrayList<String> quiz1 = FEquestion1.get(randNum1); という処理で積んだ中からランダムに問題を取り出しているようですね。
RunningReo

2020/10/11 07:57

長々とお付き合いありがとうございました。 理解できたので、良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問