Android Studio 错误:尝试在空对象引用上调用虚拟方法 'android.text.Editable android.widget.EditText.getText()'



我一直在尝试为我的应用程序创建这个自定义对话框窗口,当按下它时,它会弹出并请求用户的数字输入。我以前测试过这个自定义对话框,它在过去也成功地工作过,但当我在这种情况下尝试它时,它不断抛出"的错误;尝试在null对象引用上调用虚拟方法"android.text.Editable android.widget.EditableText.getText((";在

final EditText inputNumber = input_score.findViewById(R.id.inputNumber);
numberOfPoints = Integer.parseInt(inputNumber.getText().toString()); 

当按下按钮打开自定义弹出窗口时,此错误会导致屏幕在返回应用程序主菜单之前熄灭几秒钟。应该发生的是弹出对话框窗口以获取用户的输入

private void openDialog() {
input_score = new Dialog(this);
beginButton = findViewById(R.id.beginButton);
final EditText inputNumber = input_score.findViewById(R.id.inputNumber);
numberOfPoints = Integer.parseInt(inputNumber.getText().toString());
input_score.setContentView(R.layout.input_score);
input_score.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
input_score.show();
beginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (inputNumber.getText().toString().trim().isEmpty()) {
//change textview to error for a few seconds before returning to normal
} else {
if (Integer.parseInt(inputNumber.getText().toString()) <= 0 || Integer.parseInt(inputNumber.getText().toString()) > 900) {
startActivity(new Intent(MainMenu.this, MainGame.class));
}
}
}
});

完整错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rockpaperscissors, PID: 4683
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at com.example.rockpaperscissors.MainMenu.openDialog(MainMenu.java:67)
at com.example.rockpaperscissors.MainMenu.access$000(MainMenu.java:20)
at com.example.rockpaperscissors.MainMenu$1.onClick(MainMenu.java:47)
at android.view.View.performClick(View.java:7217)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:7191)
at android.view.View.access$3500(View.java:828)
at android.view.View$PerformClick.run(View.java:27679)
at android.os.Handler.handleCallback(Handler.java:900)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8347)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)

我不确定我是如何解决这个问题的,所以请指出代码中的错误,以改进和解决它。谢谢

编辑:正如@Shay Kin所展示的,他使用了一个onShowListener,然后将按钮Listener放在其中,这样它就会知道这个对话框何时会弹出,然后随之弹出按钮函数。在我的情况下,代码不断中断的原因不仅是因为定位错了.show,还因为我有这个变量"点数";它不断解析一个空的文本字段并破坏代码,因为内部没有值。直到我再次深入研究并删除了那个变量,我才注意到这一点。

我修复代码的方法是实现他的解决方案,该解决方案已经将buttonListener合并到其中,并删除numberOfPoints变量。这导致程序被修复并成功运行

可能是因为EditText在不同的范围内?尝试在函数外声明EditText(在其他组件旁边(。onClick()函数是一个回调,因此一旦openDialog()完成执行,EditText可能会被丢弃。

在调用Dialog.show()之前,视图还不存在,因此findViewById()找不到所需的视图,而是返回null。视图只有在调用show()create()之后才可用。

由于您实际上并不需要提前进行初始化,因此可以将此初始化移动到您实际需要的位置

beginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Initialize it here
final EditText inputNumber = input_score.findViewById(R.id.inputNumber);
if (inputNumber.getText().toString().trim().isEmpty()) {
//change textview to error for a few seconds before returning to normal
} else {
if (Integer.parseInt(inputNumber.getText().toString()) <= 0 || Integer.parseInt(inputNumber.getText().toString()) > 900) {
startActivity(new Intent(MainMenu.this, MainGame.class));
}
}
}
});

但是,需要注意的是,根据官方文档,应避免直接使用Dialog类。

正如@Gabriel所说,您得到了NullPointerException,因为您初始化了EditText对话框显示后,您可以添加侦听器,当对话框在此处可见时,您可以初始化所有视图

private void openDialog() {
input_score = new Dialog(this);
input_score.setContentView(R.layout.speach_dialog);
input_score.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

input_score.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
beginButton = findViewById(R.id.beginButton);
final EditText inputNumber = input_score.findViewById(R.id.inputNumber);
numberOfPoints = Integer.parseInt(inputNumber.getText().toString());
beginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (inputNumber.getText().toString().trim().isEmpty()) {
//change textview to error for a few seconds before returning to normal
} else {
if (Integer.parseInt(inputNumber.getText().toString()) <= 0 || Integer.parseInt(inputNumber.getText().toString()) > 900) {
startActivity(new Intent(MainMenu.this, MainGame.class));
}
}
}
});
}
});
input_score.show();
}

相关内容

最新更新