简体   繁体   中英

Android App Crashes When Start Button is Clicked

im trying to develop a game in android, however im kinda newbie yet ! Anyways my game consists of two Activities (1. The main menu 2. The game ) . The game starts with the main menu activity and when the user clicks the button with ID= ( button2 ) it should initiate the second activity of the game : Here is the .xml code of my MainMenu :

<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainMenu"
android:background="@drawable/starting_page">

<Button
    android:layout_width="400dp"
    android:layout_height="45dp"
    android:text="Exit Game"
    android:id="@+id/button"
    android:background="#f6d89d00"
    android:textSize="30sp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="39dp" />

<Button
    android:layout_width="400dp"
    android:layout_height="45dp"
    android:text="Start Game"
    android:id="@+id/button2"
    android:background="#f6d86d00"
    android:textSize="30sp"
    android:layout_above="@+id/button"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:clickable="true"
    android:enabled="true"
    android:visibility="visible"
    android:focusableInTouchMode="true" />

<CheckBox
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:text="Sound"
    android:id="@+id/checkBox"
    android:textSize="20dp"
    android:longClickable="false"
    android:layout_alignParentBottom="true"
    android:layout_alignRight="@+id/button"
    android:layout_alignEnd="@+id/button"
    android:enabled="true" />
</RelativeLayout>

and he is the so far code in this activity:

package com.example.user.catchthefly;

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.Intent;
import android.widget.ImageView;
import android.graphics.Color;
import static android.graphics.Color.*;

public class MainMenu extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);
    final Button btn1 = (Button) findViewById(R.id.button2);
    final Button btn2 = (Button) findViewById(R.id.button);
    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            finish();
            System.exit(0);
        }
    });
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(MainMenu.this, MainGame.class);
            MainMenu.this.startActivity(intent);
            finish();
        }
    });
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

and below i provide the AndroidManifest.xml just in case you need to it to sum up whats wrong:

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

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MainGame"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name=".ScorePage"
        android:label="@string/app_name" >
    </activity>
</application>

</manifest>

logcat

07-21 13:50:53.828      811-811/com.example.user.catchthefly E/Trace﹕ error opening trace file: No such file or directory (2)
07-21 13:50:55.478      811-811/com.example.user.catchthefly D/dalvikvm﹕ GC_FOR_ALLOC freed 55K, 7% free 2564K/2740K, paused 36ms, total 39ms
07-21 13:50:55.588      811-811/com.example.user.catchthefly D/dalvikvm﹕ GC_FOR_ALLOC freed 2K, 6% free 2901K/3080K, paused 26ms, total 27ms
07-21 13:50:55.868      811-811/com.example.user.catchthefly D/libEGL﹕ loaded /system/lib/egl/libEGL_emulation.so
07-21 13:50:55.888      811-811/com.example.user.catchthefly D/﹕ HostConnection::get() New Host Connection established 0x2a154d08, tid 811
07-21 13:50:55.938      811-811/com.example.user.catchthefly D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_emulation.so
07-21 13:50:55.979      811-811/com.example.user.catchthefly D/libEGL﹕ loaded /system/lib/egl/libGLESv2_emulation.so
07-21 13:50:56.308      811-811/com.example.user.catchthefly W/EGL_emulation﹕ eglSurfaceAttrib not implemented
07-21 13:50:56.328      811-811/com.example.user.catchthefly D/OpenGLRenderer﹕ Enabling debug mode 0
07-21 13:50:56.548      811-814/com.example.user.catchthefly D/dalvikvm﹕ GC_CONCURRENT freed 359K, 14% free 2937K/3416K, paused 6ms+46ms, total 117ms
07-21 13:51:49.189      811-811/com.example.user.catchthefly D/AndroidRuntime﹕ Shutting down VM
07-21 13:51:49.199      811-811/com.example.user.catchthefly W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-21 13:51:49.229      811-811/com.example.user.catchthefly E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.user.catchthefly/com.example.user.catchthefly.MainGame}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at android.app.Activity.findViewById(Activity.java:1839)
            at com.example.user.catchthefly.MainGame.<init>(MainGame.java:25)
            at java.lang.Class.newInstanceImpl(Native Method)
            at java.lang.Class.newInstance(Class.java:1319)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

The problem is that when i start the program all goes normally but when i click the button "Start Game" (with id ( Button2 ) ) the game crashes in the emulator ... I have spent hours trying to find out whats wrong but i cant seem to spot the problem so any help is welcomed thank you very much!!!

SOLUTION : i had initiated the buttons , layouts , textviews , imageviews in the MainGame.class above the onCreate method thats why the program crashed thank you for your answers :)

You are using

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

        finish();
        System.exit(0);
    }
});

Here finish(); is nothing but you are trying to close the current activity and System.exit(0): is nothing but you are going out from the application.

And change btn1 code to like this:

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

        Intent intent = new Intent(MainMenu.this, MainGame.class);
        startActivity(intent);
        finish();

    }
});

change this code....

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

        Intent intent = new Intent(MainMenu.this, MainGame.class);
        MainMenu.this.startActivity(intent);
        finish();
    }
});

to this...

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

        Intent intent = new Intent(MainMenu.this, MainGame.class);
        startActivity(intent);
        finish();

    }
});

You might want to change the id value for both buttons:

final Button btn1 = (Button) findViewById(R.id.button2);
final Button btn2 = (Button) findViewById(R.id.button);

On a side note: You tell right here that you want to stop the current activity and quit the application:

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

        finish();
        System.exit(0);
    }
});

I think MainGame code has some problem other wise post your log cat with filter error. But I recomend to check the code of MainGame class

In your code you call System.exit(0) which causes the VM to stop running and the program to exit with the given exit status. Taken from here. In other words this will close your app. What you are trying to do is close just the activity which is done by calling finish() which you can see the use and desciption here .

Also in your button 2 on click code you are not starting any activity. To start an activity just add the line like you did in your button 1 code with the fromActivity and the toActivity. Then start it with startActivity(intent) .

Your code should like something like this...

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

        Intent intent = new Intent(MainMenu.this, MainGame.class);
        startActivity(intent);
        finish();
    }

I'm not sure what your second button is intended to do but the MainMenu if its your main activity is already started and does not needed to be started with startActivity() since you are already there.

Also as a side note, your button names should represent what they should be used for so you can read the code easily. Using goToGame or goToMainMenu would be easier people to keep track of.

Caused by: java.lang.NullPointerException
  at android.app.Activity.findViewById(Activity.java:1839)
  at com.example.user.catchthefly.MainGame.<init>(MainGame.java:25)

In MainGame , you're calling findViewById() too early when initializing member variables.

Move the findViewById() to onCreate() after setContentView() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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