首页 > 解决方案 > 为什么 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

标签: javaandroidandroid-studioonclicklistener

解决方案


显然,唯一的问题是在这段代码中创建了对话框

        Button btnSubmitResetPassword = (Button)findViewById(R.id.btnSubmitResetPassword);

需要从对话框本身获取参考,正确的代码是 -

        Button btnSubmitResetPassword = (Button)d.findViewById(R.id.btnSubmitResetPassword);

现在以适当的方式引用它。


推荐阅读