从对话框中调用对话框

时间:2012-04-05 14:28:30

标签: android android-dialog

我正在尝试在我的应用程序中完成登录对话框,并且在处理对话框时遇到问题。

我有三个对话框,第一个是AlertDialog作为登录对话框,第二个是progressDialog,还有一个显示错误消息的alertDialog。这是我的代码:

protected Dialog onCreateDialog(int id) {
    switch (id) {
    case KBConstants.DIALOG_LOGIN_ID:
        TextView textUsername;
        TextView textPassword;
        TextView textSave;
        // Here I build my Layout
        ...
        // return dialog
        return new AlertDialog.Builder(this).setTitle(R.string.login_title).setMessage(R.string.login_introduction).setView(loginLayout).setIcon(R.drawable.kreative_barometer_72x72)
                .setPositiveButton(R.string.login_ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final DialogInterface d = dialog;
                        if (checkBoxSave.isChecked()) {
                            setRememberLogin(true);
                        } else {
                            setRememberLogin(false);
                        }
                        waitConnect = ProgressDialog.show(KreativBarometerMainView.this, getString(R.string.login_connect_title), getString(R.string.login_connect_introduction), false, true);
                        Thread t1 = new Thread() {
                            public void run() {
                                Looper.prepare();
                                DataStruct dataStruct = null;
                                try {
                                    dataStruct = SoapHandler.makeCall(SoapHashMap.CHECK_USER_LOGIN, mainService.getSoapMap(), editUsername.getText().toString(), editPassword.getText().toString(), null, null);
                                    ServerMessageStruct sms = (ServerMessageStruct) dataStruct;
                                    if (sms.getMsgType() == 1) {
                                        mainService.setUserValidation(true);
                                        setLogin(editUsername.getText().toString(), editPassword.getText().toString());
                                    } else {
                                        mainService.setUserValidation(false);

                                        setLogin(null, null);
                                                                                }
                                } catch (IOException ioe) {
                                    mainService.setUserValidation(false);
                                    setLogin(null, null);

                                } catch(XmlPullParserException xmlppe){

                                } finally{
                                    if(!mainService.isUserValidated()){
                                        waitConnect.dismiss();
                                        showDialog(KBConstants.DIALOG_NO_LOGIN_USER_ID);
                                    }
                                }
                                waitConnect.dismiss();
                            }
                        };
                        t1.start();

                    }
                }).setNeutralButton(R.string.login_setup, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                        /* User clicked setup so do some stuff */
                        startActivity(new Intent(packageContext, SettingView.class));
                    }
                }).setNegativeButton(R.string.login_cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                        /* User clicked cancel so do some stuff */
                        KreativBarometerMainView.this.finish();
                    }
                }).setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        KreativBarometerMainView.this.finish();

                    }
                }).create();
    case KBConstants.DIALOG_NO_LOGIN_USER_ID:
        return new AlertDialog.Builder(this).setMessage(R.string.login_info_error_user).setIcon(R.drawable.kreative_barometer_72x72).setTitle(R.string.login_error)
                .setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        showDialog(KBConstants.DIALOG_LOGIN_ID);
                    }
                }).create();
    }
    return null;
} 

当用户点击“连接”(正面按钮)时,将进行SOAP调用以使用验证用户数据的Web服务。当用户正在等待进行呼叫时,将显示progressDialog以指示工作。调用完成后,如果用户数据无效,则应显示DIALOG_NO_LOGIN_USER_ID对话框。用户可以单击“确定”,再次显示登录对话框。

但是没有显示DIALOG_NO_LOGIN_USER_ID对话框。我试图在Thread启动后调用showDialog(),但之后会出现线程问题。将显示该对话框,但忽略验证结果。

任何人都可以帮助我了解如何管理对话框吗?使用AlertDialog作为登录对话框还有其他任何“更好”的解决方案吗?

的问候, HTZ

2 个答案:

答案 0 :(得分:0)

好吧,首先,你不需要在另一个内部调用对话框。你所做的只是获取onClickListener到对话框按钮并相应地做事情。例如当用户点击您的"connect" (positive button)时,您将使用onClick()方法调用下一个对话框。

但是,如果你只想这样,那么你需要一个Activity Context,你可以将它作为参数传递给你的自定义对话框,并使用该上下文调用一个新的对话框。

答案 1 :(得分:0)

此问题的解决方案是使用类

android.os.AsyncTask<Params, Progress, Result>

最好的描述在die JavaDoc中给出:

“AsyncTask允许正确和容易地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。”

通过使用方法onPreExecute(),您可以在UI线程上操作View。

完成此方法后,将调用doInBackground(),您可以在此处开始后台操作。此方法不适用于UI线程,因此它不会阻止您的应用程序。

调用此onPostExecute()后,您可以使用计算结果。

我的问题是在进行背景操作时正确显示进度指示器。这可以通过使用onProgressUpdate()方法来完成,该方法在UI线程中工作,同时进行后台计算。