我正在尝试在我的应用程序中完成登录对话框,并且在处理对话框时遇到问题。
我有三个对话框,第一个是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
答案 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线程中工作,同时进行后台计算。