Android App математические игры аварии

Я новичок в разработке Android, и я пытаюсь создать приложение для школьного проекта. Я искал в интернете и нашел некоторые руководства / коды для математического приложения, которое я хочу создать. Я скопировал / вставил некоторые из них, и мне удалось создать предпочтительный пользовательский интерфейс. Когда я запускаю игру все хорошо, но когда я играю в игру разбился. Игра об основных математических операциях. Ответы являются случайными (например. 5×5=?) и пользователь должен ответить. Если ответ правильный, появляется галочка, а когда он неправильный, появляется крестик. При использовании приложения мне удается ввести ответ, но при нажатии кнопки enter или C приложение аварийно завершает работу..Есть идеи? (Я новичок в этом, и я надеюсь, что я понимаю, что вы говорите мне: P) спасибо!

Основной xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 

android_id="@+id/activity_display_message"
android_layout_width="match_parent"
android_layout_height="match_parent"

tools_context="com.example.miltos.maths.DisplayMessageActivity">

<include
    android_id="@id/toolbar"
    layout="@layout/tool_bar"
    />

<LinearLayout 
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_orientation="vertical"
    android_background="#84b3e7">

    <LinearLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_weight="1"
        android_orientation="horizontal">

        <ImageView
            android_id="@+id/response"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_weight="1"
            android_contentDescription="result"
            android_src="@drawable/tick"
            android_layout_gravity="bottom|left" />





    </LinearLayout>

    <LinearLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_weight="1"
        android_orientation="horizontal" >


        <TextView
            android_id="@+id/question"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_marginBottom="2dp"
            android_layout_marginLeft="2dp"
            android_layout_marginTop="2dp"
            android_layout_weight="1"
            android_background="#dfeaf1"
            android_gravity="center|right"
            android_padding="5dp"
            android_text="0 + 0"
            android_textColor="#ff333333"
            android_textSize="30sp" />

        <TextView
            android_id="@+id/answer"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_marginBottom="2dp"
            android_layout_marginRight="2dp"
            android_layout_marginTop="2dp"
            android_layout_weight="1"
            android_background="#dfeaf1"
            android_gravity="center|left"
            android_padding="5dp"
            android_text="= ?"
            android_textColor="#ff333333"
            android_textSize="30sp" />

        <Button
            android_id="@+id/clear"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#dfeaf1"
            android_gravity="center"
            android_padding="5dp"
            android_text="C"
            android_textColor="#ff333333"
            android_textSize="30sp"
            android_textStyle="bold" />



    </LinearLayout>

    <LinearLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_weight="1"
        android_orientation="horizontal" >

        <Button
            android_id="@+id/btn7"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="7"
            android_text="7"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/btn8"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="8"
            android_text="8"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/btn9"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="9"
            android_text="9"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_weight="1"
        android_orientation="horizontal" >

        <Button
            android_id="@+id/btn4"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="4"
            android_text="4"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/btn5"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="5"
            android_text="5"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/btn6"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="6"
            android_text="6"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_weight="1"
        android_orientation="horizontal" >

        <Button
            android_id="@+id/btn1"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="1"
            android_text="1"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/btn2"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="2"
            android_text="2"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/btn3"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="3"
            android_text="3"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_weight="1"
        android_orientation="horizontal" >

        <Button
            android_id="@+id/btn0"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="1"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_tag="0"
            android_text="0"
            android_textColor="#ffcccccc"
            android_textSize="30sp"
            android_textStyle="bold" />

        <Button
            android_id="@+id/enter"
            android_layout_width="0dp"
            android_layout_height="match_parent"
            android_layout_margin="1dp"
            android_layout_weight="2"
            android_background="#86959f"
            android_gravity="center"
            android_padding="5dp"
            android_text="Enter"
            android_textColor="#ff333333"
            android_textSize="30sp"
            android_textStyle="bold" />
    </LinearLayout>





</LinearLayout>

</RelativeLayout>

Java-код:

public class DisplayMessageActivity extends AppCompatActivity implements OnClickListener

{
private int level = 0,answer = 0, operator = 0, operand1 = 0, operand2 = 0;
private final int ADD_OPERATOR = 0, SUBTRACT_OPERATOR = 1, MULTIPLY_OPERATOR = 2, DIVIDE_OPERATOR = 3;
private String[] operators = {"+", "-", "x", "/"};
private int[][] levelMax = {
        {10, 25, 50},
        {10, 20, 30},
        {5, 10, 15},
        {10, 50, 100}};
private Random random;
private TextView question, answerTxt;
private ImageView response;
private Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0, enterBtn, clearBtn;

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

    question =  (TextView)findViewById(R.id.question);
    answerTxt = (TextView)findViewById(R.id.answer);
    response =  (ImageView)findViewById(R.id.response);
    response.setVisibility(View.INVISIBLE);
    btn1 = (Button)findViewById(R.id.btn1);
    btn2 = (Button)findViewById(R.id.btn2);
    btn3 = (Button)findViewById(R.id.btn3);
    btn4 = (Button)findViewById(R.id.btn4);
    btn5 = (Button)findViewById(R.id.btn5);
    btn6 = (Button)findViewById(R.id.btn6);
    btn7 = (Button)findViewById(R.id.btn7);
    btn8 = (Button)findViewById(R.id.btn8);
    btn9 = (Button)findViewById(R.id.btn9);
    btn0 = (Button)findViewById(R.id.btn0);
    enterBtn = (Button)findViewById(R.id.enter);
    clearBtn = (Button)findViewById(R.id.clear);
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
    btn4.setOnClickListener(this);
    btn5.setOnClickListener(this);
    btn6.setOnClickListener(this);
    btn7.setOnClickListener(this);
    btn8.setOnClickListener(this);
    btn9.setOnClickListener(this);
    btn0.setOnClickListener(this);
    enterBtn.setOnClickListener(this);
    clearBtn.setOnClickListener(this);
    Bundle extras = getIntent().getExtras();
    if(extras != null)
    {
        int passedLevel = extras.getInt("level", -1);
        if(passedLevel>=0) level = passedLevel;
    }

    random = new Random();
    chooseQuestion();
}
private void chooseQuestion(){
    answerTxt.setText("= ?");
    operator = random.nextInt(operators.length);
    operand1 = getOperand();
    operand2 = getOperand();

    if(operator == SUBTRACT_OPERATOR){
        while(operand2>operand1){
            operand1 = getOperand();
            operand2 = getOperand();
        }
    }

    else if(operator==DIVIDE_OPERATOR){
        while((((double)operand1/(double)operand2)%1 > 0) || (operand1==operand2))
        {
            operand1 = getOperand();
            operand2 = getOperand();
        }
    }
    switch(operator)
    {
        case ADD_OPERATOR:
            answer = operand1+operand2;
            break;
        case SUBTRACT_OPERATOR:
            answer = operand1-operand2;
            break;
        case MULTIPLY_OPERATOR:
            answer = operand1*operand2;
            break;
        case DIVIDE_OPERATOR:
            answer = operand1/operand2;
            break;
        default:
            break;
    }
    question.setText(operand1+" "+operators[operator]+" "+operand2);
}
private int getOperand(){
    return random.nextInt(levelMax[operator][level] - levelMax[operator][level] + 1)
            + levelMax[operator][level];

}




@Override
public void onClick(View view) {

    if(view.getId()==R.id.enter){
        String answerContent = answerTxt.getText().toString();
        if(!answerContent.endsWith("?"))
        {
            int enteredAnswer = Integer.parseInt(answerContent.substring(2));
            if(enteredAnswer==answer){

                response.setImageResource(R.drawable.tick);
                response.setVisibility(View.VISIBLE);

            }
            else{
                response.setImageResource(R.drawable.cross);
                response.setVisibility(View.VISIBLE);
            }
            chooseQuestion();
        }

    }
    else if(view.getId()==R.id.clear){
        answerTxt.setText("= ?");
    }
    else {
        response.setVisibility(View.INVISIBLE);
    }

    int enteredNum = Integer.parseInt(view.getTag().toString());

    if(answerTxt.getText().toString().endsWith("?"))
        answerTxt.setText("= "+enteredNum);
    else
        answerTxt.append(""+enteredNum);
}
}

Журнал ошибок:

01-16 16:04:35.300 4578-4614/com.example.miltos.maths E/EGL_emulation: tid 4614: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)
01-16 16:04:37.016 4578-4614/com.example.miltos.maths E/EGL_emulation: tid     4614: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)
01-16 16:04:39.157 4578-4578/com.example.miltos.maths E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process:  com.example.miltos.maths, PID: 4578
                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
                                                                        at com.example.miltos.maths.DisplayMessageActivity.onClick(DisplayMessageActivity.java:156)
                                                                        at android.view.View.performClick(View.java:5610)
                                                                        at android.view.View$PerformClick.run(View.java:22265)
                                                                        at android.os.Handler.handleCallback(Handler.java:751)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

2 ответа

  1. Добавьте в код следующее

    btn1.setTag('1');
    btn2.setTag('2');
    btn3.setTag('3');
    btn4.setTag('4');
    

    Аналогично для всех 10 кнопок и попробуйте запустить тот же код, который вы опубликовали.

  2. Вы привязали функцию обратного вызова onClick ко всем кнопкам, включая кнопку enterandclear. Однако следующая строка кода, которая вызывает проблему

    int enteredNum = Integer.parseInt(view.getTag().toString());

    пытается получить входные данные в элементе пользовательского интерфейса и назначить его enteredNum, что имеет смысл на входных элементах пользовательского интерфейса, но не на кнопках enterandclear. Таким образом, вы получаетеNullPointerException, так как нет никакого значения для чтения.

    Я бы предложил следующий подход. Создайте обратный вызов e onClick и назначьте их следующим образом:

    • Один на ваших входных полях.
    • Один на кнопку» enter».
    • Один на кнопку» Очистить».

    Это позволит понять, что при нажатии на enterкнопку, вы не хотите читать ничего из него.

    Таким образом, вы можете разделить бизнес-логику каждой кнопки. Помимо решения вашей проблемы, это будет хорошей практикой для младшего разработчика.

    Я бы также предложил начать разделять ваш код на отдельные классы, как общий принцип, чтобы было легче читать и особенно поддерживать. Отличное чтение, которое охватывает эти принципы в своих первых главах, — это чистый код Роберта С. Мартина .

    Не стесняйтесь, дайте мне знать, если ваши проблемы с приложением сохраняются.