[英]How to stop my Alert Dialog from being immediately dismissed?
我正在嘗試讀取登機牌條形碼,以告知用戶我們是否有他們的航班詳細信息,如果有,為什么呢。 我正在使用AlertDialogs與用戶通信,因為Toast通知的顯示不夠清晰。 但是,在用戶未單擊“確定”的情況下,它們將在調用后立即關閉。
如何停止呢? onActivityResult是放置此代碼的錯誤位置嗎?
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String boardingPassString = intent
.getStringExtra("SCAN_RESULT");
Log.d("Scan Result", "contents: " + boardingPassString);
String flightNumber = dataProcessor.decodeFlightNumber(boardingPassString);
Builder dialogBuilder = new AlertDialog.Builder(this);
String isFlightOld = isFlightOld(boardingPassString);
if(isFlightOld.equals(CURRENT))
{
Log.d("Block", "Current");
postData(flightNumber);
}
else if(isFlightOld.equals(TOO_NEW))
{
dialogBuilder.setTitle(R.string.dialog_title_new);
dialogBuilder.setMessage(R.string.dialog_msg_new1 + flightNumber + R.string.dialog_msg_new2);
dialogBuilder.setPositiveButton(android.R.string.ok, null);
AlertDialog alert = dialogBuilder.create();
alert.show();
Log.d("Block", getResources().getString(R.string.dialog_title_new));
}
else if(isFlightOld.equals(OLD))
{
dialogBuilder.setTitle(R.string.dialog_title_old);
dialogBuilder.setMessage(R.string.dialog_msg_old1 + flightNumber + R.string.dialog_msg_old2);
dialogBuilder.setPositiveButton(android.R.string.ok, null);
AlertDialog alert = dialogBuilder.create();
alert.show();
Log.d("Block", getResources().getString(R.string.dialog_title_old));
}
else
{
dialogBuilder.setTitle(R.string.dialog_title_error);
dialogBuilder.setMessage(R.string.dialog_msg_error).show();
dialogBuilder.setPositiveButton(android.R.string.ok, null);
AlertDialog alert = dialogBuilder.create();
alert.show();
Log.d("Block", getResources().getString(R.string.dialog_title_error));
}
} else if (resultCode == RESULT_CANCELED) {
Log.d("Scan Result", "RESULT_CANCELED");
}
}
}
呼叫碼
scanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Testing shortcut
// =================================
// getXMLFlightDetails("US729");
// ==================================
// Uncomment to return Barcode scanning!!!
// =============================================
Intent intent = new Intent(getApplicationContext(),
CaptureActivity.class);
intent.setAction("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "PDF417_MODE");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);
}
});
只需嘗試以下代碼,希望它可以工作。 您需要在Dialog Builder中傳遞上下文。 然后,Android操作系統將知道對話框附加到的活動以及應將其彈出的位置。
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String boardingPassString = intent
.getStringExtra("SCAN_RESULT");
Log.d("Scan Result", "contents: " + boardingPassString);
String flightNumber = dataProcessor.decodeFlightNumber(boardingPassString);
Builder dialogBuilder = new AlertDialog.Builder(this);
String isFlightOld = isFlightOld(boardingPassString);
if(isFlightOld.equals(CURRENT))
{
Log.d("Block", "Current");
postData(flightNumber);
}
else if(isFlightOld.equals(TOO_NEW))
{
displayAlert(R.string.dialog_msg_new1 + flightNumber + R.string.dialog_msg_new2);
Log.d("Block", getResources().getString(R.string.dialog_title_new));
}
else if(isFlightOld.equals(OLD))
{
displayAlert(R.string.dialog_msg_old1 + flightNumber + R.string.dialog_msg_old2);
Log.d("Block", getResources().getString(R.string.dialog_title_old));
}
else
{
displayAlert(R.string.dialog_msg_error);
Log.d("Block", getResources().getString(R.string.dialog_title_error));
}
} else if (resultCode == RESULT_CANCELED) {
Log.d("Scan Result", "RESULT_CANCELED");
}
}
}
displayAlert(String message)
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyActivity.this);
alertDialog.setTitle(getResources().getString(R.string.alert_title));
alertDialog.setMessage(message);
alertDialog.setPositiveButton(getResources().getString(R.string.ok),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
//your action here
}
});
alertDialog.setNegativeButton(getResources().getString(R.string.ok),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Your Action here
}
});
alertDialog.show();
}
如果這樣不能解決您的問題。 然后,您需要顯示您的整個活動代碼,因為可能會在對話框顯示到屏幕后不久完成您的活動。
原來這是一個多線程問題。 方法postData使用HTTPResponse調用,因此不在主線程上。 此方法將在顯示對話框之后的幾毫秒內完成,而這正是關閉alertDialogs的原因。
一個簡單的join()調用即可使主線程等待postData方法完成其業務,然后再顯示alertDialogs。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.