Модальное диалоговое окно Android

1

Моя цель - отобразить модальный диалог, когда пользователь перейдет обратно в мое приложение. Этот модальный диалог задает им 6-значный PIN-код, который они определили. Я новичок в разработке графических интерфейсов Java и Android, поэтому моя проблема -.....

Я нахожу, что если пользователь решает свести к минимуму приложение, пока отображается диалоговое окно enterpin, если они возвращаются в приложение, стек диалоговых окон поверх друг друга. Заставляя их вводить свой PIN-код столько раз, сколько они сворачиваются и возвращаются в приложение во время ввода PIN-кода.

/**
 * On restart called when the app is being restarted on the screen
 */
@Override
public void onRestart() {
    super.onRestart();



    // must prompt with modal dialog for pin

    final Dialog dialog = new Dialog(this);

    dialog.setCancelable(false);

    // check pin
    dialog.setCanceledOnTouchOutside(false);
    // set view to enterpin XML screen
    dialog.setContentView(R.layout.enterpin);


    // show dialog
    if (!dialog.isShowing()) {
        dialog.show();
    }
    // listen for button being clicked
    Button button = (Button) dialog.findViewById(R.id.pinlogin);
    button.setOnClickListener(new OnClickListener() {// anonymous inner
        // class
        // implementation
        @Override
        public void onClick(View v) {
            EditText editText = (EditText) dialog
                    .findViewById(R.id.enterpintext);
            try {
                int enteredPin = Integer.parseInt(editText.getText()
                        .toString());
                SharedPreferences sharedP = Prefs.get(WebViewActivity.this);
                int temp = sharedP.getInt("pin", 0);
                if (enteredPin == temp) {
                    pinCheck = true;



                    dialog.dismiss();
                } else {
                    pinCheck = false;
                    dialog.setTitle("Incorrect Pin");
                }
            } catch (NumberFormatException e) {
                Dialog dialog2 = new Dialog(WebViewActivity.this);
                dialog2.setTitle("Enter Numbers Only");
                dialog2.setCanceledOnTouchOutside(true);
                dialog2.show();
            }
        }
    });

}

Где-то я мог бы переместить мою инициализацию Dialog, не чувствуя себя плохой практикой программирования? Я понимаю, почему метод dialog.isShowing(), который я пробовал, не работает, потому что мой экземпляр Dialog существует только для жизни метода.

Я также замечаю, что если вы поворачиваете телефон на 90 градусов от вертикальной к горизонтальной ориентации, а наоборот, мои диалоги исчезают. Может ли кто-нибудь указать цепочку методов, вызванных, когда это принудительное перерисовка происходит, чтобы я мог перерисовать мои диалоги?

  • 0
    Ваш код решил мою проблему: вызов setCanceledOnTouchOutside. Тем не менее, я подклассы деятельности вместо диалога; в этом случае вызов setFinishOnTouchOutside. Это, используемое в сочетании с android: theme = "@android:style/Theme.Dialog&quoandroid: style / Theme.Dialog", делает деятельность похожей на диалог.
Теги:
user-interface

2 ответа

2
Лучший ответ

Я считаю, что вы ищете onResume(); + onPause(); а не onRestart(); для создания вашего диалога. Вы должны использовать onRestart(); для установки флажка для отображения PIN-кода, но не для создания диалога.

Я предлагаю вам переместить его в onCreate(); метод, сделать его свойством активности, над которой вы работаете, и просто отобразить ее в onResume(); метод (поскольку он всегда будет вызываться каждый раз, когда актив активен, даже в первый раз).

Кроме того, когда меняется ориентация, вам нужно указать, что вы хотите прослушать событие изменения ориентации (через android:configChanges="orientation" в манифесте активности) и onConfigurationChanged(); метод будет вызываться активным действием с соответствующими данными. Затем вы можете перерисовать диалоги в новую ориентацию.

1

Я сталкиваюсь с одной и той же проблемой (ввод ввода или иначе), сохраняя по диалогу в свойстве активности, всякий раз, когда я показываю диалог, я использую что-то в этих строках:

protected android.app.Dialog onCreateDialog(int id) {
        if (this.currentDialog != null) {
            this.currentDialog.dismiss();
        }

        this.currentDialog = null;

        switch (id) {
            case DIALOG_SPINNER:
                ProgressDialog progressDialog = new ProgressDialog(this);
                progressDialog.setMessage(getString(R.string.dialog_Spinner_UpdatingAccount));
                progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

                this.currentDialog = progressDialog;
                break;
        }

        return this.currentDialog;

    }

Я также удаляю текущий диалог, когда активность покидает верхнюю часть стека (перемещаться или выходить).

@Override
    public void onPause() {
        if (this.currentDialog != null) {
            this.currentDialog.dismiss();
        }

        super.onPause();
    }

Метод onPause позволяет вам отменить любой диалог, который уже открыт при приостановке действия, таким образом, ваш существующий код onRestart просто покажет новое диалоговое окно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню