私のアプリケーションでログインダイアログを完了しようとしていますが、ダイアログの処理に問題があります。ダイアログからダイアログを呼び出す
3つのダイアログがあります。まず、ログインダイアログとしてAlertDialog、2番目に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
ダイアログが表示されます。ユーザーがOKをクリックすると、ログインダイアログが再度表示されます。
しかし、DIALOG_NO_LOGIN_USER_IDダイアログが表示されません。スレッドを開始した後にshowDialog()を呼び出そうとしましたが、スレッドの問題があります。ダイアログが表示されますが、検証の結果は無視されます。
ダイアログの管理方法を教えてもらえますか? AlertDialogをログインダイアログとして使用するための、他の、おそらく「より良い」ソリューションはありますか?
に関して、 HTZ
これは私がやっていることです...最初のDialogのonClick()メソッドで次の2番目のDialogを呼び出します。私は最初のダイアログを作成し、onClick()でスレッドが開始されます。このスレッドの最後に、次のダイアログが表示されます。スレッドが動作している間、進捗ダイアログが表示されます。 文脈のことを説明できますか?なぜ私はこれを動作させるための特別なコンテキストが必要なのかはわかりません。私はすでに 'this'を呼び出すことによって' activity context'を使用しています – htz
あなたは 'context'のためにgoogleする必要があります。また、 'onClick'に入れたくない場合、ダイアログが閉じられたときにだけそれを望むならば、ダイアログに' OnDismissListener'を設定することができます。 – Rajkiran