1

I'm really really new with java and android and i'm mostly self-taught. I need help with this problem im getting. It may be something really stupid, obvious, or dumb but hey, i have to start somewhere right? My app crashes at startup. I get this message in the logcat after i try to run my app.

This is my code, its an exercise where im supposed to make a little app where you get some countries displayed, and you type in their capitals. Im using 3 buttons, 2 textviews and 1 edittext.

MainActivity.java

    public class MainActivity extends Activity {
public int cuenta = 0;
public TextView questionlabel = (TextView) findViewById(R.id.textView1);
public TextView resultadolabel = (TextView) findViewById(R.id.textView2);
public Button startbutton = (Button) findViewById(R.id.button1);
public Button checkbutton = (Button) findViewById(R.id.button2);
public Button nextbutton = (Button) findViewById(R.id.button3);
public EditText inputbox = (EditText) findViewById(R.id.editText1);

public String[] mPaises = {
        "Canada",
        "Estados Unidos",
        "Mexico",
        "Guatemala",
        "Belice"};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    startbutton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            //start button
    questionlabel.setText(mPaises[cuenta]);
        }});

    checkbutton.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            // check button
            if (cuenta == 0) {
                if (inputbox.toString() == "Ottawa") {
                    resultadolabel.setText("Correcto");}
                else {resultadolabel.setText("Respuesta correcta: Ottawa");}}
            else if (cuenta == 1) {
                if (inputbox.toString() == "Washington") {
                    resultadolabel.setText("Correcto");}
                else {resultadolabel.setText("Respuesta correcta: Washington");}}
            else if (cuenta == 2) {
                if (inputbox.toString() == "Mexico") {
                    resultadolabel.setText("Correcto");}
                else {resultadolabel.setText("Respuesta correcta: Mexico");}}
            else if (cuenta == 3) {
                if (inputbox.toString() == "Guatemala") {
                    resultadolabel.setText("Correcto");}
                else {resultadolabel.setText("Respuesta correcta: Guatemala");}}
            else if (cuenta == 4) {
                if (inputbox.toString() == "Belmopan") {
                    resultadolabel.setText("Correcto");}
                else {resultadolabel.setText("Respuesta correcta: Belmoopan");}}
        }
    });

    nextbutton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // LO QUE HACE EL NEXT BUTTON
            cuenta = cuenta + 1;
            questionlabel.setText(mPaises[cuenta]);


        }
    });

}

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

}

This is my Activity_Main

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<EditText
    android:id="@+id/editText1"
    android:inputType="text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="129dp"
    android:ems="10" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/editText1"
    android:layout_alignLeft="@+id/editText1"
    android:layout_marginBottom="42dp"
    android:layout_marginLeft="16dp"
    android:text="@string/Start" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/button1"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="63dp"
    android:text="@string/pais" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button1"
    android:layout_alignBottom="@+id/button1"
    android:layout_toRightOf="@+id/button1"
    android:text="@string/check" />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/button2"
    android:layout_toRightOf="@+id/button2"
    android:text="@string/next" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/button1"
    android:layout_alignLeft="@+id/textView1"
    android:layout_marginBottom="21dp"
    android:text="@string/mensaje" />

And my manifest

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.capitales.del.mundo"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Jorge Gil
  • 2,805
  • 1
  • 15
  • 22

2 Answers2

1

You need to first inflate your layout, and then retrieve your UI elements, otherwise findViewById returns null and hence your app crash caused by a NullPointerException at this line :

startbutton.setOnClickListener


So inflate your layout using setContentView(R.layout.activity_main); and then get your UI elements.
public TextView questionlabel;
public TextView resultadolabel;
public Button startbutton;
public Button checkbutton;
public Button nextbutton;
public EditText inputbox;    

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    questionlabel = (TextView) findViewById(R.id.textView1);
    resultadolabel = (TextView) findViewById(R.id.textView2);
    startbutton = (Button) findViewById(R.id.button1);
    checkbutton = (Button) findViewById(R.id.button2);
    nextbutton = (Button) findViewById(R.id.button3);
    inputbox = (EditText) findViewById(R.id.editText1);
    /****/
}

Notes :

  • if (inputbox.toString() == "Ottawa") Don't compare content of Strings using ==. Use equals() instead.
  • See How do I compare Strings in Java ?
  • Next time, include your logcat in the question
Community
  • 1
  • 1
Alexis C.
  • 91,686
  • 21
  • 171
  • 177
0

Write all the code after these two lines ,

super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

Because how could you retrieve an id or an element before it is created.

But you can declare it before it. But retrieving an id must be after the activity is created.

Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300