java - 为什么 setOnClickListener 会使我的应用程序崩溃?
问题描述
为了在我的应用程序中重置用户密码,我决定创建一个对话框让用户输入他们的电子邮件,这样我就可以向他们发送邮件来重置密码。对话框有效,它看起来像 -那个
创建对话框的代码:
public void CreateDialogResetPassword ()
{
d = new Dialog(this);
d.setContentView(R.layout.resetpassword_layout);
d.setCancelable(true);
btnResetPassword = (Button)findViewById(R.id.btnResetPassword);
etEmailResetPassword = (EditText)findViewById(R.id.etResetPasswordEmail);
d.setTitle("Reset Password");
d.show();
}
问题是每当我将 setOnClickListener 添加到 btnResetPassword 然后单击 Forgot Password imageButton 时,应用程序就会崩溃。
这是添加 setOnClickListener 方法后的代码。
public void CreateDialogResetPassword ()
{
d = new Dialog(this);
d.setContentView(R.layout.resetpassword_layout);
d.setCancelable(true);
btnResetPassword = (Button)findViewById(R.id.btnResetPassword);
btnResetPassword.setOnClickListener(this);
etEmailResetPassword = (EditText)findViewById(R.id.etResetPasswordEmail);
d.setTitle("Reset Password");
d.show();
}
添加 setOnClickListener 然后单击应该打开对话框的忘记密码图像按钮后会发生什么,这基本上会使应用程序崩溃并进入主页。
这就是 onClick 的样子 -
@Override
public void onClick(View v) {
if (v==btnLogin)
{
login();
}
if (v == btnSignUpMain) {
CreateDialogSignUp();
}
if (v == imageBtnSingUp) {
register();
}
if (v==imageBtnResetPassword)
{
CreateDialogResetPassword();
}
您可以忽略 onClick 中的大部分代码。我不知道这有多重要,但还是决定添加它。
日志猫 -
2021-05-06 17:18:15.429 9175-9175/com.example.recyclub I/AssistStructure: Flattened final assist data: 1992 bytes, containing 1 windows, 12 views
2021-05-06 17:18:18.295 9175-9175/com.example.recyclub D/AndroidRuntime: Shutting down VM
2021-05-06 17:18:18.296 9175-9175/com.example.recyclub E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.recyclub, PID: 9175
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.recyclub.MainActivity.CreateDialogResetPassword(MainActivity.java:143)
at com.example.recyclub.MainActivity.onClick(MainActivity.java:207)
at android.view.View.performClick(View.java:7448)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2021-05-06 17:18:18.333 9175-9175/com.example.recyclub I/Process: Sending signal. PID: 9175 SIG: 9
解决方案
显然,唯一的问题是在这段代码中创建了对话框
Button btnSubmitResetPassword = (Button)findViewById(R.id.btnSubmitResetPassword);
需要从对话框本身获取参考,正确的代码是 -
Button btnSubmitResetPassword = (Button)d.findViewById(R.id.btnSubmitResetPassword);
现在以适当的方式引用它。
推荐阅读
- python - 在python中添加动态表名
- python - PostgreSQL SELECT column names programmatically in python
- react-native - 无法使用 react-native-share 通过 fb messenger 共享 base 64 图像
- java - 具有多个连接但只有一个线程的 ServerSocket
- node.js - 节点加密 sha256 不适用于空格
- azure - 使用哪个 Azure API,我的软件可以识别它是否在 Azure 基础架构上而不是在其他地方运行
- java - 在 Java 中将一个数组列表复制到另一个数组的时间复杂度是多少?
- python - MysqlDB - 查询被杀死
- node.js - fs.writeFile() 是否处理 nodejs 中的竞争条件?
- php - PostgreSQL 不允许字符串值