簡體   English   中英

如何阻止我的警報對話框立即被關閉?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM