【问题标题】:Showing a dialog twice after pressing home key and turn back to app按home键并返回应用程序后显示两次对话框
【发布时间】:2011-02-03 16:45:57
【问题描述】:

我正在开发一个 Android 2.2 应用。

我使用一个对话框来询问用户他的昵称。这是我的源代码:

private void showDialog() {
    //set up dialog
    final Dialog dialog = new Dialog(UserStatsActivity.this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.createuserrow);
    dialog.setOnDismissListener(this);

    //set up button
    Button button = (Button) dialog.findViewById(R.id.saveUser);
    button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            TextView nameTextView = (TextView)dialog.findViewById(R.id.userName);
            userNickName = nameTextView.getText().toString().trim();

            if ((userNickName.length() > 0) &&
                (userNickName.length() < 9)){
                saveUser = true;
                dialog.dismiss();
            }
        }
    });
    //now that the dialog is set up, it's time to show it    
    dialog.show();
}

public void onDismiss(DialogInterface arg0) {
    try {
        if (saveUser) {
            SharedPreferences prefs = 
                PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            User.saveUser(getApplicationContext(), userNickName);
            Editor editor = prefs.edit();
            editor.putString(USER_NAME, userNickName);
            editor.putBoolean(FIRST_TIME_RUN, false);
            editor.commit();
            loadPreferences();
        }
    }
    catch (Exception ex){
        Log.e(Constants.APP_TAG, "UActivity: " + ex.getMessage());
        showAlert(this.getString(R.string.errorClose));
    }
}

如果我在显示对话框时按主页键。当我再次启动应用程序并单击保存按钮时,再次显示对话框。

我已经调试了我的代码,它运行良好,但对话框仍然打开。

发生了什么事?

谢谢。

【问题讨论】:

    标签: android modal-dialog android-2.2-froyo


    【解决方案1】:

    我会使用 onCreateDialog() 和 onPrepareDialog() 方法。通过这样做,您可以更好地控制何时填充和显示对话框。

    onCreateDialog() 在对话框首次显示时触发。此方法是设置对话框的方法。

    onPrepareDialog() 在每次显示之前触发。此方法是在以后每次更改选项的方法。

    @Override
        protected Dialog onCreateDialog(int id) {
        super.onCreateDialog(id);
        final Dialog dialog = new Dialog(UserStatsActivity.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.createuserrow);
        dialog.setOnDismissListener(this);
    
        //set up button
        Button button = (Button) dialog.findViewById(R.id.saveUser);
        button.setOnClickListener(new View.OnClickListener() {
    
            public void onClick(View v) {
                TextView nameTextView = (TextView)dialog.findViewById(R.id.userName);
                userNickName = nameTextView.getText().toString().trim();
    
                if ((userNickName.length() > 0) && (userNickName.length() < 9)){
                    saveUser = true;
                    dialog.dismiss();
                }
            }
        });
    //now that the dialog is set up, it's time to show it
    return dialog;
    }
    

    这就是在您的情况下如何使用 onCreateDialog(int id) 方法。现在,请记住,上面我没有考虑您可以创建的任何其他对话框,因此您应该为您的 Dialog 分配一个常量 Int 并在此方法中确定。

    还请记住,此方法在第一个对话框中被调用。您必须使用:

    @Override
    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
        super.onPrepareDialog(id, dialog, args);
        if(id == DIALOG_DEFAULT) {
            dialog.setTitle(mSettings.getString(getString(R.string.key_due_date), getString(R.string.unknown_task)));
        ((AlertDialog)dialog).setMessage(mSettings.getString(getString(R.string.key_task), getString(R.string.unknown_task)));
        }
    }
    

    为每个后续对话框重新填充,或将 removeDialog(int DIALOG_ID); 添加到您的 onClick。

    【讨论】:

      【解决方案2】:

      您不应该在 showDialog() 上检查保存的用户名吗?

      【讨论】:

      • 如果我检查用户是否保存在 showDialog 方法中,对话框仍在打开。
      • 检查在 onPrepareDialog() 期间设置的用户名,如果设置了,您可以调用 finish() 来停止显示活动。或者在 dialog.show() 行周围的 showDialog() 中使用 if 语句。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2014-01-16
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多