我的目标是在用户导航回我的应用时显示模式对话框。此模式对话框要求他们输入他们定义的6位数PIN。我是Java GUI和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 :(得分:2)
我相信您正在寻找onResume();
+ onPause();
而不是onRestart();
来创建对话框。您应该使用onRestart();
为要显示的PIN对话框设置标志,但不能创建对话框。
我建议您将其移至onCreate();
方法,将其设置为您正在处理的活动的属性,并将其显示在onResume();
方法中(因为它始终会被调用)每次活动都是活跃的,即使是第一次。)
此外,当方向发生变化时,您需要列出要收听方向更改事件(通过活动清单中的android:configChanges="orientation"
),并在活动状态上调用onConfigurationChanged();
方法具有相应数据的活动。然后,您可以将对话框重绘为新方向。
答案 1 :(得分: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代码就会显示一个新对话框。