0

ユーザー向けの質問をランダムに生成し、結果を表示する Android QuizApp を作成しました。ユーザーが質問の数と難易度を入力するユーザー インターフェイスを実装しようとすると、アプリケーションがクラッシュし始め、致命的な例外が発生しました。私は4つのクラスを持っています:

package com.example.quizapp;

import java.util.Random;
public class Quiz {
private int difficulty;
private int numberOfQuestions;
private Question[] questions;

public Quiz(String difficulty, int numberOfQuestions) {
    setDifficulty(difficulty);
    this.numberOfQuestions = numberOfQuestions;
    this.questions = new Question[this.numberOfQuestions];
    for (int i = 0; i < this.numberOfQuestions; i++) {
        this.questions[i] = new Question(this.difficulty);
    }

}

public void setDifficulty(String difficulty) {
   if (difficulty ==  "easy") {
            this.difficulty = 1;
   } else  if (difficulty ==  "medium"){
            this.difficulty = 2;
   } else  if (difficulty ==  "hard"){
       this.difficulty = 3;
   } else {
       this.difficulty = -1;
   }
}

public String getDifficulty() {
    switch (difficulty) {
        case 1:
            return "easy";
        case 2:
            return "medium";
        case 3:
            return "hard";
        default:
            return "Difficulty not set correctly";
    }
}

public Question getQuestionInstance(int number) {
    return this.questions[number];
}
public String getQuestion(int number) {
    return this.questions[number].QUESTION;
}

public int getOptionA(int number) {
    return this.questions[number].OPTA;
}

public int getOptionB(int number) {
    return this.questions[number].OPTB;
}

public int getOptionC(int number) {
    return this.questions[number].OPTC;
}

public int getAnswer(int number) {
    return this.questions[number].ANSWER;
}

class Question {

    private int firstNumber;
    private int secondNumber;
    private char sign;
    private String QUESTION;
    private int OPTA;
    private int OPTB;
    private int OPTC;
    private int ANSWER;
    private int difficulty;
    private Random rand;

    public Question(int difficulty) {
        this.difficulty = difficulty;
        this.rand = new Random();
        this.firstNumber = getRandomNumber();
        this.secondNumber = getRandomNumber();
        this.sign = getRandomSign();
        this.ANSWER = calculateAnswer();
        initializeOptions();
        this.QUESTION = this.firstNumber + " " + this.sign + " " + this.secondNumber + " = ";
    }

    public String getQuestion() {
        return this.QUESTION;
    }

    public int getOptionA() {
        return this.OPTA;
    }

    public int getOptionB() {
        return this.OPTB;
    }

    public int getOptionC() {
        return this.OPTC;
    }

    public int getAnswer() {
        return this.ANSWER;
    }

    private void initializeOptions() {
        int number = this.rand.nextInt(3) + 1;

        switch (number) {
            case 1:
                this.OPTA = this.ANSWER;
                this.OPTB = (int) Math.floor(this.ANSWER - this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTC = (int) Math.floor(this.ANSWER + this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                break;
            case 2:
                this.OPTA = (int) Math.floor(this.ANSWER - this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTB = this.ANSWER;
                this.OPTC = (int) Math.floor(this.ANSWER + this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                break;
            case 3:
                this.OPTA = (int) Math.floor(this.ANSWER - this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTB = (int) Math.floor(this.ANSWER + this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTC = this.ANSWER;
                break;
        }

    }

    private int calculateAnswer() {
        int answer = 0;
        switch (this.sign) {
            case '+':
                answer = this.firstNumber + this.secondNumber;
                break;
            case '-':
                answer = this.firstNumber - this.secondNumber;
                break;
            case '*':
                answer = this.firstNumber * this.secondNumber;
                break;
            case '/':
                answer = this.firstNumber / this.secondNumber;
                break;
        }

        return answer;
    }

    private int getRandomNumber() {
        int number;
        if (this.difficulty == 1) {
            //number = 1 +  Math.random()*100;
            number = this.rand.nextInt(100) + 1;
        } else if (this.difficulty == 2) {
            //number = 1 +  Math.random()*1000;
            number = this.rand.nextInt(1000) + 1;
        } else {
            //number = 1 +  Math.random()*1000;
            number = this.rand.nextInt(1000) + 1;
        }
        return number;
    }

    private char getRandomSign() {
        int number;
        char sign;
        //easy
        if (this.difficulty == 1) {
            number = this.rand.nextInt(2) + 1;
            sign = convertNumberToSign(number);
            //medium
        } else if (this.difficulty == 2) {
            if (this.firstNumber > 10 && this.secondNumber > 10) {
                number = this.rand.nextInt(2) + 1;
                sign = convertNumberToSign(number);
            } else {
                number = this.rand.nextInt(3) + 1;
                sign = convertNumberToSign(number);
            }
            //hard
        } else {
            if (this.firstNumber / this.secondNumber == (int) (this.firstNumber / this.secondNumber)) {
                number = this.rand.nextInt(4) + 1;
                sign = convertNumberToSign(number);
            } else {
                number = this.rand.nextInt(3) + 1;
                sign = convertNumberToSign(number);
            }
        }
        return sign;
    }

    private char convertNumberToSign(int number) {
        if (number == 1) {
            return '+';
        } else if (number == 2) {
            return '-';
        } else if (number == 3) {
            return '*';
        } else {
            return '/';
        }
    }

}

}

package com.example.quizapp;

import com.example.quizapp.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class QuizActivity extends Activity 
{
Quiz quiz;
RadioButton rb1, rb2, rb3, rb4, rb5, rb6;
Button buttonOK;
String ans;
int num = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ui);
    rb1=(RadioButton)findViewById(R.id.radio3);
    rb2=(RadioButton)findViewById(R.id.radio4);
    rb3=(RadioButton)findViewById(R.id.radio5);
    rb4=(RadioButton)findViewById(R.id.radio6);
    rb5=(RadioButton)findViewById(R.id.radio7);
    rb6=(RadioButton)findViewById(R.id.radio8);

    buttonOK=(Button)findViewById(R.id.button2);        
    buttonOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            RadioGroup group2=(RadioGroup)findViewById(R.id.radioGroup3);
            RadioButton answer2=(RadioButton)findViewById(group2.getCheckedRadioButtonId());
            if (answer2.equals(rb4))
            {
                num = 5;
            }
            else if (answer2.equals(rb5))
            {
                num = 10;
            }
            else
            {
                num = 15;
            }

            RadioGroup group1=(RadioGroup)findViewById(R.id.radioGroup2);
            RadioButton answer1=(RadioButton)findViewById(group1.getCheckedRadioButtonId());
            if (answer1.equals(rb1))
            {
                ans = "easy";
            }
            else if (answer1.equals(rb2))
            {
                ans = "medium";
            }
            else
            {
                ans = "hard";
            }


        }
    });

    Intent intent = new Intent(QuizActivity.this, QuestActivity.class);
            intent.putExtra("answer", ans);
            intent.putExtra("question", num);
            QuizActivity.this.startActivity(intent);
            finish();


}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_ui, menu);
    return true;
}
}

package com.example.quizapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class QuestActivity extends Activity
{
Quiz quiz;
int score = 0;
int qid = 0;
Quiz.Question currentQuest;
TextView textQuestion;
RadioButton rba, rbb, rbc;
Button buttonNext;
    String answer = null;
    int numOfQuestion = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
    Intent intent= getIntent();
    if (intent != null)
    {
answer=intent.getStringExtra("answer");
numOfQuestion=intent.getIntExtra("question", 0);
    }


    quiz= new Quiz(answer,numOfQuestion);
currentQuest=quiz.getQuestionInstance(qid);
textQuestion=(TextView)findViewById(R.id.textView1);
rba=(RadioButton)findViewById(R.id.radio0);
rbb=(RadioButton)findViewById(R.id.radio1);
rbc=(RadioButton)findViewById(R.id.radio2);
buttonNext=(Button)findViewById(R.id.button1);
setQuestionView();

buttonNext.setOnClickListener(new View.OnClickListener() 
{       
    @Override
    public void onClick(View v) 
    {
        RadioGroup group=(RadioGroup)findViewById(R.id.radioGroup1);
        RadioButton answer=(RadioButton)findViewById(group.getCheckedRadioButtonId());
        Log.d("yourans", currentQuest.getAnswer() + " " + answer.getText());
           if(Integer.toString(currentQuest.getAnswer()).equals(answer.getText()) )
        {
            score++;
            Log.d("score", "Your score" + score);
        }
        if(qid<numOfQuestion)
        {                   
            currentQuest=quiz.getQuestionInstance(qid);
            setQuestionView();
        }else
        {
            Intent intent = new Intent(QuestActivity.this, ResultActivity.class);
            Bundle b = new Bundle();
            b.putInt("score", score);
            intent.putExtras(b);
            startActivity(intent);
            finish();
        }
    }
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_quiz, menu);
return true;
}



private void setQuestionView()
{
   textQuestion.setText(currentQuest.getQuestion());
   rba.setText(Integer.toString(currentQuest.getOptionA()));
   rbb.setText(Integer.toString(currentQuest.getOptionB()));
   rbc.setText(Integer.toString(currentQuest.getOptionC()));
qid++;
}
}

package com.example.quizapp;
import com.example.quizapp.R;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.RatingBar;
import android.widget.TextView;

public class ResultActivity extends Activity 
{
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);
    //access rating bar
    RatingBar rbar=(RatingBar)findViewById(R.id.ratingBar1); 
        rbar.setNumStars(5);
    rbar.setStepSize(0.5f);
        TextView t=(TextView)findViewById(R.id.textResult);
        //get and display the score
    Bundle b = getIntent().getExtras();
        int score= b.getInt("score");
        rbar.setRating(score);

        switch (score)
        {
    case 1:
        case 2: t.setText("Better Luck Next Time!");
        break;
    case 3:
    case 4:t.setText("Quite average");
    break;
    case 5:t.setText("Congratulations !");
    break;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.activity_result, menu);
    return true;
}
}

編集: AndroidManifest.xml を追加しました

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.quizapp"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.quizapp.QuizActivity"
        android:label="@string/quiz_app" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.quizapp.QuestActivity"
        android:label="@string/title_activity_quiz" >
    </activity>
    <activity
        android:name="com.example.quizapp.ResultActivity"
        android:label="@string/title_activity_result" >
    </activity>
</application>

</manifest>

編集: 提案どおりにアプリケーションを更新すると、このエラーがポップアップ表示され、アプリがクラッシュします:

10-23 10:10:32.368: E/AndroidRuntime(827): FATAL EXCEPTION: main
10-23 10:10:32.368: E/AndroidRuntime(827): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.quizapp/com.example.quizapp.QuestActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-23 10:10:32.368: E/AndroidRuntime(827):  at    android.os.Handler.dispatchMessage(Handler.java:99)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.os.Looper.loop(Looper.java:137)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-23 10:10:32.368: E/AndroidRuntime(827):  at java.lang.reflect.Method.invokeNative(Native Method)
10-23 10:10:32.368: E/AndroidRuntime(827):  at java.lang.reflect.Method.invoke(Method.java:525)
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-23 10:10:32.368: E/AndroidRuntime(827):  at dalvik.system.NativeStart.main(Native Method)
10-23 10:10:32.368: E/AndroidRuntime(827): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.example.quizapp.Quiz.getQuestionInstance(Quiz.java:45)
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.example.quizapp.QuestActivity.onCreate(QuestActivity.java:52)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.Activity.performCreate(Activity.java:5133)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-23 10:10:32.368: E/AndroidRuntime(827):  ... 11 more
4

3 に答える 3

3

マニフェストでこれを確認してください:

android:name="com.example.quizapp.QuizApp"

このアクティビティ「QuizApp」はありますか?

マニフェストを次のように変更します。

android:name="com.example.quizapp.QuizActivity"

HTH。

于 2013-10-21T13:12:51.817 に答える
2

Activityという名前QuizAppのがあることを Android に伝えMain Activityました。

 <activity
        android:name="com.example.quizapp.QuizApp"
        android:label="@string/quiz_app" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
 </activity>

しかし、あなたはそれを実装したことはありません。Android はパッケージでそのアクティビティを探しますが、LogCat メッセージのからわかるように、それを見つけることcom.example.quizappできません。ClassNotFoundException

10-21 06:31:26.907: E/AndroidRuntime(816): ... java.lang.ClassNotFoundException: Didn't find class "com.example.quizapp.QuizApp"...

QuizApp を実装する必要がありますActivity

于 2013-10-21T13:02:27.190 に答える
0

Manifestファイルにパッケージ名の不一致エラーがあるようです。として修正します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.quizapp"
   ...
</manifest>

また、各アクティビティの完全修飾名を指定できることを忘れないでください。

           <activity
            android:name="com.example.quizapp.Activity_name"
            ...>
            </activity>

必要に応じて編集

package com.example.quizapp;

import com.example.quizapp.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class QuizActivity extends Activity 
{
Quiz quiz;
RadioButton rb1, rb2, rb3, rb4, rb5, rb6;
Button buttonOK;
String ans;
int num = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ui);
    rb1=(RadioButton)findViewById(R.id.radio3);
    rb2=(RadioButton)findViewById(R.id.radio4);
    rb3=(RadioButton)findViewById(R.id.radio5);
    rb4=(RadioButton)findViewById(R.id.radio6);
    rb5=(RadioButton)findViewById(R.id.radio7);
    rb6=(RadioButton)findViewById(R.id.radio8);

    buttonOK=(Button)findViewById(R.id.button2);        
    buttonOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            RadioGroup group2=(RadioGroup)findViewById(R.id.radioGroup3);
            RadioButton answer2=(RadioButton)findViewById(group2.getCheckedRadioButtonId());
            if (answer2.equals(rb4))
            {
                num = 5;
            }
            else if (answer2.equals(rb5))
            {
                num = 10;
            }
            else
            {
                num = 15;
            }

            RadioGroup group1=(RadioGroup)findViewById(R.id.radioGroup2);
            RadioButton answer1=(RadioButton)findViewById(group1.getCheckedRadioButtonId());
            if (answer1.equals(rb1))
            {
                ans = "easy";
            }
            else if (answer1.equals(rb2))
            {
                ans = "medium";
            }
            else
            {
                ans = "hard";
            }


        }
    });

    //*********Edit

    //Intent intent = new Intent(QuizActivity.this, QuestActivity.class);
    //QuizActivity.this.startActivity(intent);
    //finish();

    Intent intent = new Intent(QuizActivity.this, QuestActivity.class);
    intent.putExtra("answer", ans);
    intent.putExtra("question", num);
    QuizActivity.this.startActivity(intent);
    finish();

    //*******Edit

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_ui, menu);
    return true;
}
}

ここで 次のアクティビティ

package com.example.quizapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class QuestActivity extends Activity
{
Quiz quiz;
int score = 0;
int qid = 0;
Quiz.Question currentQuest;
TextView textQuestion;
RadioButton rba, rbb, rbc;
Button buttonNext;

QuizActivity qa = new QuizActivity();
String ans = qa.ans;
int num = qa.num;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);

//*********Edit

Intent intent= getActivity().getIntent();
String answer=intent.getStringExtra("answer");
int numOfQuestion=intent.getIntExtra("question", 0);

//quiz= new Quiz(ans, num);

quiz= new Quiz(answer,numOfQuestion);

//*******

currentQuest=quiz.getQuestionInstance(qid);
textQuestion=(TextView)findViewById(R.id.textView1);
rba=(RadioButton)findViewById(R.id.radio0);
rbb=(RadioButton)findViewById(R.id.radio1);
rbc=(RadioButton)findViewById(R.id.radio2);
buttonNext=(Button)findViewById(R.id.button1);
setQuestionView();

buttonNext.setOnClickListener(new View.OnClickListener() 
{       
    @Override
    public void onClick(View v) 
    {
        RadioGroup group=(RadioGroup)findViewById(R.id.radioGroup1);
        RadioButton answer=(RadioButton)findViewById(group.getCheckedRadioButtonId());
        Log.d("yourans", currentQuest.getAnswer() + " " + answer.getText());
           if(Integer.toString(currentQuest.getAnswer()).equals(answer.getText()) )
        {
            score++;
            Log.d("score", "Your score" + score);
        }
        if(qid<num)
        {                   
            currentQuest=quiz.getQuestionInstance(qid);
            setQuestionView();
        }else
        {
            Intent intent = new Intent(QuestActivity.this, ResultActivity.class);
            Bundle b = new Bundle();
            b.putInt("score", score);
            intent.putExtras(b);
            startActivity(intent);
            finish();
        }
    }
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_quiz, menu);
return true;
}



private void setQuestionView()
{
   textQuestion.setText(currentQuest.getQuestion());
   rba.setText(Integer.toString(currentQuest.getOptionA()));
   rbb.setText(Integer.toString(currentQuest.getOptionB()));
   rbc.setText(Integer.toString(currentQuest.getOptionC()));
qid++;
}
}
于 2013-10-21T12:45:40.990 に答える