gpt4 book ai didi

java - Android:分配按钮 id 时获取空值

转载 作者:行者123 更新时间:2023-12-01 18:20:15 27 4
gpt4 key购买 nike

我正在制作一个简单的 3x3 网格类型应用程序,当我单击按钮时,最后单击的按钮是“”,而我刚刚单击的按钮是“!”。但是,我不断收到错误,

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View 
android.view.Window.findViewById(int)' on a null object reference

代码如下:package com.example.ryanfolz.gridgame;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class GameActivity extends ActionBarActivity {

private Context ctx;
public int j = 1;
public int i = 1;
public final int[][] buttons = new int[][] {
{R.id.top_left_button, R.id.top_center_button, R.id.top_right_button},
{R.id.left_button, R.id.center_button, R.id.right_button},
{R.id.bottom_left_button, R.id.bottom_center_button, R.id.bottom_right_button}};
private Button lastButton;

public void setPlayer(Button button){
lastButton = (Button)findViewById(R.id.center_button);
button.setText("!");
lastButton.setText(" ");
lastButton = button;

}


@Override


protected void onCreate(Bundle savedInstanceState) {


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


ctx = this;

final GameEngine game = new GameEngine();
lastButton = (Button)findViewById(R.id.center_button);
for (i = 0; i < buttons.length; i++) {
for (j = 0; j < buttons[i].length; j++) {
final Button button = (Button)findViewById(buttons[i][j]);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Button b = (Button)v;
game.updatePlayer(b);
}
});
}
}

Button backButton = (Button)findViewById(R.id.back_button);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent gotoMenu = new Intent(ctx, MainActivity.class);
startActivity(gotoMenu);

}
});
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_game, 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();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

另一个方法是这个

public class GameEngine {

GameActivity game = new GameActivity();
public void updatePlayer(Button buttonID){
game.setPlayer(buttonID);

}

日志猫是这样的:

01-07 15:52:38.892    1929-1929/com.example.ryanfolz.gridgame E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.ryanfolz.gridgame, PID: 1929
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
at android.app.Activity.findViewById(Activity.java:2071)
at com.example.ryanfolz.gridgame.GameActivity.setPlayer(GameActivity.java:25)
at com.example.ryanfolz.gridgame.GameEngine.updatePlayer(GameEngine.java:21)
at com.example.ryanfolz.gridgame.GameActivity$1.onClick(GameActivity.java:54)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
01-07 15:52:40.775 2285-2300/com.example.ryanfolz.gridgame D/OpenGLRenderer﹕ Render dirty regions requested: true
01-07 15:52:40.778 2285-2285/com.example.ryanfolz.gridgame D/﹕ HostConnection::get() New Host Connection established 0xa6c4a590, tid 2285
01-07 15:52:40.873 2285-2285/com.example.ryanfolz.gridgame D/Atlas﹕ Validating map...

感谢您的帮助

}`

最佳答案

我相信问题出在这里:

GameActivity game = new GameActivity();
public void updatePlayer(Button buttonID){
game.setPlayer(buttonID);
}

您通过直接调用构造函数来创建 GameActivity,而不是由 Android 系统本身构造它。我怀疑这意味着您会发现onCreate尚未被调用 - 所以您从未夸大您的布局。如果没有布局,就无法在其中找到 View 。

不清楚为什么你要自己构建一个 Activity ,但我建议你应该尝试找到一种替代设计,它允许你获得适合你的上下文的相关 Activity - 一个 Activity Android 的其余部分以正常方式“了解”。

关于java - Android:分配按钮 id 时获取空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27828480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com