Моя цель - отобразить модальный диалог, когда пользователь перейдет обратно в мое приложение. Этот модальный диалог задает им 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 градусов от вертикальной к горизонтальной ориентации, а наоборот, мои диалоги исчезают. Может ли кто-нибудь указать цепочку методов, вызванных, когда это принудительное перерисовка происходит, чтобы я мог перерисовать мои диалоги?
Я считаю, что вы ищете onResume();
+ onPause();
а не onRestart();
для создания вашего диалога. Вы должны использовать onRestart();
для установки флажка для отображения PIN-кода, но не для создания диалога.
Я предлагаю вам переместить его в onCreate();
метод, сделать его свойством активности, над которой вы работаете, и просто отобразить ее в onResume();
метод (поскольку он всегда будет вызываться каждый раз, когда актив активен, даже в первый раз).
Кроме того, когда меняется ориентация, вам нужно указать, что вы хотите прослушать событие изменения ориентации (через android:configChanges="orientation"
в манифесте активности) и onConfigurationChanged();
метод будет вызываться активным действием с соответствующими данными. Затем вы можете перерисовать диалоги в новую ориентацию.
Я сталкиваюсь с одной и той же проблемой (ввод ввода или иначе), сохраняя по диалогу в свойстве активности, всякий раз, когда я показываю диалог, я использую что-то в этих строках:
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 просто покажет новое диалоговое окно.