2016-10-30 4 views
1

Я создаю простую викторину в соответствии с этим руководством, но приложение вылетает с кнопкой «Следующий ответ», связанной с проверенным переключателем.Сбой приложения для Android при нажатии кнопки

Главный код:

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 сообщение:

java.lang.NullPointerException: Попытка вызвать виртуальный метод 'INT android.widget.RadioGroup.getCheckedRadioButtonId()' на нулевой объект ссылка

Я не понимаю эту ошибку, почему не называется метод? Может кто-нибудь помочь?

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> 
+1

Ваше объявление переменной 'rg', а затем ничего не делая с этим. Однако вам нужно инициализировать 'rg'. –

+0

Я добавил эту строку в Oncreate: rg = (RadioGroup) findViewById (R.id.group); но все же сбой – glassraven

+0

с той же ошибкой? можете ли вы разместить свой соответствующий xml? –

ответ

2

Причина вы получаете первую NullPointerException, потому что вы должны надуть rg перед его использованием.

Второй NullPointerException возможно связан с тем, что вы нажимаете кнопку «Далее» без выбора переключателя. Чтобы этого не произошло, вы можете добавить нулевую проверку внутри OnClickListener или выбрать одну из переключателей по умолчанию. Для того, чтобы выбрать переключатель по умолчанию, добавьте следующую строку в XML:

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

В качестве альтернативы, вы можете установить по умолчанию проверяется RadioButton в вашем Activity:

rg.check(R.id.radioButton) 
Смежные вопросы