Android 按钮上的NullPointerException';s onclick侦听器
我正在为一个人工智能学期项目编写一个Android游戏应用程序。我在主类的第38行得到一个NullPointerException,它是启动屏幕上新游戏按钮的setOnClickListener WW3类活动的相关章节:Android 按钮上的NullPointerException';s onclick侦听器,android,nullpointerexception,android-button,Android,Nullpointerexception,Android Button,我正在为一个人工智能学期项目编写一个Android游戏应用程序。我在主类的第38行得到一个NullPointerException,它是启动屏幕上新游戏按钮的setOnClickListener WW3类活动的相关章节: public class WW3Activity extends Activity { public boolean DebugMode = false; private String buildMenuEmplacement = ""; //[Initialization
public class WW3Activity extends Activity
{
public boolean DebugMode = false;
private String buildMenuEmplacement = "";
//[Initialization] Called when the app is first launched
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.startscreen);
//[Initialization] Makes the button resources available to the class
final Button newGame = (Button) findViewById(R.id.buttonNewGame);
final Button loadGame = (Button) findViewById(R.id.buttonLoadGame);
final Button exitGame = (Button) findViewById(R.id.buttonExit);
final Button about = (Button) findViewById(R.id.buttonAbout);
final Button troll = (Button) findViewById(R.id.buttonTroll);
final Button debug = (Button) findViewById(R.id.buttonDebug);
//[Action] When user pushes the New Game button
newGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on click
setContentView(R.layout.main);
buttonInitialize();
}
});
//[Action] When user pushes the Exit Game button
exitGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on click
finish();
}
});
//[Action] When user pushes the Debug Mode button
exitGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on click
DebugMode = true;
}
});
}
//[Initialization] Gets the emplacements ready to be pushed
public void buttonInitialize()
{
final ImageView pe1 = (ImageView) findViewById(R.id.playerEmplacement1);
final ImageView pe2 = (ImageView) findViewById(R.id.playerEmplacement2);
final ImageView pe3 = (ImageView) findViewById(R.id.playerEmplacement3);
final ImageView pc = (ImageView) findViewById(R.id.playerCity);
final ImageView ee1 = (ImageView) findViewById(R.id.enemyEmplacement1);
final ImageView ee2 = (ImageView) findViewById(R.id.enemyEmplacement2);
final ImageView ee3 = (ImageView) findViewById(R.id.enemyEmplacement3);
final ImageView ec = (ImageView) findViewById(R.id.enemyCity);
registerForContextMenu(findViewById(R.id.playerEmplacement1));
registerForContextMenu(findViewById(R.id.playerEmplacement2));
registerForContextMenu(findViewById(R.id.playerEmplacement3));
registerForContextMenu(findViewById(R.id.enemyEmplacement1));
registerForContextMenu(findViewById(R.id.enemyEmplacement2));
registerForContextMenu(findViewById(R.id.enemyEmplacement3));
/*empAction(pe1);
empAction(pe2);
empAction(pe3);
empAction(ee1);
empAction(ee2);
empAction(ee3);
empAction(ec);
empAction(pc);*/
}
以及LogCat:
10-24 13:29:12.297: D/dalvikvm(440): GC_FOR_ALLOC freed 40K, 4% free 6356K/6595K, paused 177ms
10-24 13:29:12.303: I/dalvikvm-heap(440): Grow heap (frag case) to 6.653MB for 409616-byte allocation
10-24 13:29:12.503: D/dalvikvm(440): GC_FOR_ALLOC freed <1K, 5% free 6755K/7047K, paused 128ms
10-24 13:29:12.614: D/dalvikvm(440): GC_FOR_ALLOC freed 400K, 8% free 6762K/7303K, paused 57ms
10-24 13:29:12.663: D/AndroidRuntime(440): Shutting down VM
10-24 13:29:12.663: W/dalvikvm(440): threadid=1: thread exiting with uncaught exception (group=0x40014760)
10-24 13:29:12.683: E/AndroidRuntime(440): FATAL EXCEPTION: main
10-24 13:29:12.683: E/AndroidRuntime(440): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.mbijou.cosc473.ww3/edu.mbijou.cosc473.ww3.WW3Activity}: java.lang.NullPointerException
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.access$500(ActivityThread.java:122)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.os.Handler.dispatchMessage(Handler.java:99)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.os.Looper.loop(Looper.java:132)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.main(ActivityThread.java:4123)
10-24 13:29:12.683: E/AndroidRuntime(440): at java.lang.reflect.Method.invokeNative(Native Method)
10-24 13:29:12.683: E/AndroidRuntime(440): at java.lang.reflect.Method.invoke(Method.java:491)
10-24 13:29:12.683: E/AndroidRuntime(440): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-24 13:29:12.683: E/AndroidRuntime(440): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-24 13:29:12.683: E/AndroidRuntime(440): at dalvik.system.NativeStart.main(Native Method)
10-24 13:29:12.683: E/AndroidRuntime(440): Caused by: java.lang.NullPointerException
10-24 13:29:12.683: E/AndroidRuntime(440): at edu.mbijou.cosc473.ww3.WW3Activity.onCreate(WW3Activity.java:38)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.Activity.performCreate(Activity.java:4397)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
10-24 13:29:12.683: E/AndroidRuntime(440): ... 11 more
10-2413:29:12.297:D/dalvikvm(440):全部释放40K,4%释放6356K/6595K,暂停177ms
10-24 13:29:12.303:I/dalvikvm堆(440):对于409616字节分配,将堆(frag案例)增长到6.653MB
10-24 13:29:12.503:D/dalvikvm(440):GC_FOR_ALLOC freed似乎newGame
为空。是否有多个名为startscreen.xml的布局?此异常的常见原因是在一个版本中创建ButtonNewName,而不是在另一个版本中创建ButtonNewName;这将导致代码正确生成,但在运行时失败,正如您所描述的,当活动布局无法指定按钮时。导致findViewById()
返回null
的唯一原因是您正在查找的视图不属于当前视图。(使用setContentView()
设置的视图)。如果R.id.buttonNewGame
位于R.layout.startscreen
中,请尝试清理并重建您的项目。我会定期看到此错误,我的问题是android在不同的布局中不正确地维护相同的id。确保您的id不仅在一个布局中是唯一的,而且在整个应用程序中也是唯一的。在第38行设置断点并启动调试器。您很可能试图引用xml文件R.layout.startscreen外的一个按钮,该按钮将抛出NullPointerException。您能通过startscreen.xml吗?请添加startscreen.xml布局文件。在我看来,按钮名称不在此布局中。这就是为什么findViewById返回null,从而在尝试调用此按钮的方法时引发NullPointerException。我将尝试清理并重新生成。如果我们要使用任何其他布局的按钮,以及您的R.id.PlayerEmplace1等声明在何处?好吧,但在您的活动中使用startscreen,main.xml中的所有元素在此不可用。。。将您的按钮初始化功能移动到与main.xml对应的activity(活动)。单击new game(新游戏)会将contentview设置为main,而这正是声明和使用位置和城市的地方。我的意思是创建不同的activity(活动),而不是调用setContentView(main.xml)-创建后更改上下文视图并不容易。谢谢您的回答,我开始发疯了,因为按钮不是另一个视图的一部分或类似的东西。我的问题是,我正在支持多个屏幕尺寸,我添加了一个按钮,而不是在所有的布局。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="493dp"
android:layout_marginTop="217dp"
android:src="@drawable/logo" >
</ImageView>
<Button
android:id="@+id/buttonNewGame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/logo"
android:layout_marginLeft="200dp"
android:layout_marginTop="133dp"
android:clickable="true"
android:text="@string/bNewGame" >
</Button>
<Button
android:id="@+id/buttonLoadGame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/buttonNewGame"
android:layout_alignLeft="@+id/buttonTroll"
android:layout_alignRight="@+id/buttonTroll"
android:clickable="true"
android:text="@string/bLoadGame" >
</Button> <Button
android:id="@+id/buttonExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/buttonLoadGame"
android:layout_alignBottom="@+id/buttonLoadGame"
android:layout_alignLeft="@+id/buttonDebug"
android:layout_alignRight="@+id/buttonDebug"
android:layout_toRightOf="@+id/buttonLoadGame"
android:clickable="true"
android:text="@string/bExit" >
</Button>
<Button
android:id="@+id/buttonAbout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonNewGame"
android:layout_alignRight="@+id/buttonNewGame"
android:layout_below="@+id/buttonNewGame"
android:layout_marginTop="50dp"
android:text="@string/bAbout" />
<Button
android:id="@+id/buttonTroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/buttonAbout"
android:layout_alignBottom="@+id/buttonAbout"
android:layout_centerHorizontal="true"
android:text="@string/bTrollface" />
<Button
android:id="@+id/buttonDebug"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/buttonTroll"
android:layout_toRightOf="@+id/buttonTroll"
android:layout_marginLeft="200dp"
android:text="@string/bDebug" />
</RelativeLayout>