Как получить доступ к EditText в диалоге? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь получить доступ к строке EditText в диалоговом окне, но получаю ошибку ссылки на нулевой объект и не могу понять, почему:

        txtLostCreds.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Create dialog to set new password
                AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle(R.string.txtResetPassword);
                builder.setView(R.layout.customresetpassworddialog);
                final AlertDialog alert = builder.create();
                builder.setPositiveButton(R.string.txtResetPassword, new DialogInterface.OnClickListener() {
                    final EditText resetNewPassword = alert.findViewById(R.id.resetNewPassword);
                    final EditText resetNewPasswordConfirm = alert.findViewById(R.id.resetNewPasswordConfirm);
                    @Override
                    public void onClick(final DialogInterface dialog, int which) {
                        assert resetNewPassword != null;
                        assert resetNewPasswordConfirm != null;
                        if (checkPasswords(resetNewPassword, resetNewPasswordConfirm)) {
                           // reset the password
                           RequestParams params = new RequestParams();
                           params.put("uuid", prefs.getString("myUUID", ""));
                           params.put("newpassword", resetNewPassword.getText().toString());
                           AsyncHttpRequest.get("lost_credentials", params, new TextHttpResponseHandler() {
                               @Override
                               public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                                   t.MyToast(getResources().getString(R.string.txtConnError), 5000);
                               }

                               @Override
                               public void onSuccess(int statusCode, Header[] headers, String responseString) {
                                   if (responseString.equals("OK")) {
                                       // All done. Close dialog
                                       alert.cancel();
                                   } else {
                                       t.MyToast(getResources().getString(R.string.txtConnError) + responseString, 5000);
                                   }
                               }
                           });
                       }
                   }
                });
                builder.show();
            }
        });

Ошибка возникает, когда я вызываю функцию checkPasswords(resetNewPassword, resetNewPasswordConfirm).Я также пытался сделать findViewByID на View v, но выдает ту же ошибку.

Функция так же проста, как:

private boolean checkPasswords(EditText resetNewPassword, EditText resetNewPasswordConfirm) {
        if (!resetNewPassword.getText().toString().equals(resetNewPasswordConfirm.getText().toString())) {
            resetNewPassword.setError(getResources().getString(R.string.txtDifferentPasswords));
            resetNewPasswordConfirm.setError(getResources().getString(R.string.txtDifferentPasswords));
            return false;
        } else {
            return true;
        }
    }

1 Ответ

1 голос
/ 23 апреля 2019

Постарайтесь сохранить ссылку на представление вашего диалога или, по крайней мере, на части, которыми вы управляете, вне области, в которой вы создали диалог.

Лучшей практикой будет создание DialogFragment, это отличный способ лучше контролировать диалог. Этот способ очень полезен, когда в вашем диалоговом окне выполняется много операций.

Например: попытка получить данные из диалогового окна и передать их в свою активность при нажатии кнопки «Сохранить». Вы можете использовать onActivityResult() для отправки данных в вашу деятельность.

...