简体   繁体   English

Android 应用程序因单击按钮而崩溃

[英]Android app crashes with button click

I'm creating a simple quiz according to this tutorial, but the app crashes with the button "Next answer" which is related to a checked radio button.我正在根据本教程创建一个简单的测验,但该应用程序因与选中的单选按钮相关的“下一个答案”按钮而崩溃。

Main code:主要代码:

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

public class Display extends Activity {
    TextView tv;
    Button btnNext;
    RadioGroup rg;
    RadioButton rb1, rb2,rb3;
    String questions[]={"Capital of Portugal?", "Capital of Spain?", "Capital of France?"};
    String answers[]={"Lisbn","Madrid","Paris"};
    String options[]={"Zuriq", "London","Lisbon","Manchester","Buenos Aires","Madrid", "NY", "Paris","Moscow"};

    int flag=0;

    public static int marks,correct,wrong;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dispaly);

        tv=(TextView) findViewById(R.id.tvque);
        btnNext=(Button) findViewById(R.id.btnNext);
        rb1= (RadioButton) findViewById(R.id.radioButton);
        rb2= (RadioButton) findViewById(R.id.radioButton2);
        rb3= (RadioButton) findViewById(R.id.radioButton3);

        tv.setText(questions[flag]);
        rb1.setText(options[flag*3]);
        rb2.setText(options[(flag*3)+1]);
        rb3.setText(options[(flag*3)+2]);

        Toast.makeText(this, "Negative Marks: " + MainActivity.tbflag,   1000).show();

        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            //The error comes from the line bellow, i believe:

                RadioButton user_answer=  (RadioButton)findViewById(rg.getCheckedRadioButtonId());
                String answerText=user_answer.getText().toString();

                if(answerText.equalsIgnoreCase(answers[flag])){
                    correct++;
                }else{
                    wrong++;
                    flag++;
                    if(flag<questions.length){
                        tv.setText(questions[flag]);
                        rb1.setText(options[flag*3]);
                        rb2.setText(options[(flag*3)+1]);
                        rb3.setText(options[(flag*3)+2]);
                    }
                    else
                    {
                        if(MainActivity.tbflag)
                        {
                            marks=correct-wrong;
                        }
                        else
                        {
                            marks=correct;
                        }
                        Intent in =new Intent(getApplicationContext(), ResultActivity.class);
                        startActivity(in);
                    }
                }
            }
        });
    }
}

Log message:日志消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.RadioGroup.getCheckedRadioButtonId()' on a null object reference java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.widget.RadioGroup.getCheckedRadioButtonId()”

I don't understand this error, why isn't the method being called?我不明白这个错误,为什么没有调用方法? Can someone help?有人可以帮忙吗?

XML: XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.vtorferreira.anew.MainActivity">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tvque"
    tools:text="Questions" />
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/group">
    <RadioButton
        android:text="RadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="32dp"
        android:id="@+id/radioButton" />

    <RadioButton
        android:text="RadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/radioButton"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/radioButton2" />

    <RadioButton
        android:text="RadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/radioButton3"
        android:layout_below="@+id/radioButton2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RadioGroup>

<Button
    android:text="Next Question"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="60dp"
    android:layout_marginStart="60dp"
    android:layout_marginBottom="125dp"
    android:id="@+id/btnNext" />
 </RelativeLayout>

The reason you are getting the first NullPointerException is because you must inflate rg before it is used.您获得第一个NullPointerException的原因是您必须在使用rg之前对其进行膨胀。

The second NullPointerException is possibly due to the fact that you are pressing the "Next" button with no radio button selected.第二个NullPointerException可能是由于您在没有选择单选按钮的情况下按下了“下一步”按钮。 To prevent this, you can add a null check inside the OnClickListener or select one of the radio buttons by default.为了防止这种情况,您可以在OnClickListener添加空检查或默认选择单选按钮之一。 To select a radio button by default, add the following to your XML:要默认选择单选按钮,请将以下内容添加到您的 XML:

<RadioGroup
    ...
    android:checkedButton="@+id/some-radio-button-id">
    ...
</RadioGroup>

Alternatively, you can set the default checked RadioButton in your Activity :或者,您可以在Activity设置默认选中的RadioButton

rg.check(R.id.radioButton)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM