Диалог оповещения с EditText закрывается, если ввод пуст

У меня есть диалоговое окно с текстом редактирования. Пользователь должен что-то ввести, а если нет, то система должна предупредить его, что этот ввод необходим.

Это код для Alter Dialog:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Razlog storniranja?");

    // Set up the input
    final EditText input = new EditText(this);
    // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    input.setSingleLine(false);
    input.setImeOptions(EditorInfo.IME_FLAG_NO_ENTER_ACTION);
    builder.setView(input);

    // Set up the buttons
    builder.setPositiveButton("Spremi", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    builder.setNegativeButton("Otkaži", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {

            if (m_Text.length()==0)
            {
                input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
                input.setError("Upišite razlog storniranja!");

            }

        }
    });

    builder.show();

Но когда пользователь нажимает положительную кнопку и ввод пуст, диалог закрывается. Что-то отсутствует в моем коде, чтобы избежать закрытия диалога?

РЕДАКТИРОВАТЬ

Я думаю, что нашел решение. Последняя строка builder.show(); должен быть удален, и вместо этого, этот кусок кода должен быть добавлен:

    builder.setView(input);
    final AlertDialog alertDialog = builder.create();
    alertDialog.show();

    alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Boolean wantToCloseDialog = (input.getText().toString().trim().isEmpty());
            // if EditText is empty disable closing on possitive button
            if (!wantToCloseDialog) {
                input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
                input.setError("Upišite razlog storniranja!");
                alertDialog.dismiss();
            }
        }
    });

Я надеюсь, что это поможет другим.

2 ответа

Ну, я понятия не имею, что вы пытаетесь сделать.

Ошибка при использовании вашего кода:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

m_Text должен быть инициализирован.

если m_Text не инициализирован, в методе onDismiss вам может потребоваться изменить:

if (m_Text != null && m_Text.length()==0){ //this line
     input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
     input.setError("Upišite razlog storniranja!");
}

Что касается отмены, вам нужно builder.cancelable(false); и всякий раз, когда это необходимо, builder.dismiss(),

builder.setPositiveButton("Spremi", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            m_Text = input.getText().toString();

            if (m_Text.isEmpty()) {
                input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
                input.setError("Upišite razlog storniranja!");
                input.setFocusable(true);
            }else{
                dialog.dismiss();
            }
        }
    });

Использование TextUtils.isEmpty() проверить empty строка.

Попробуй это:

builder.setPositiveButton("Spremi", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

        if(TextUtils.isEmpty(input.getText().toString())) {
            // Empty
            input.setError("Input is required!");
        } else {
            // Do something...
        }
    }
});

Надеюсь, это поможет ~

Другие вопросы по тегам