0

我正在尝试显示包含数据库内容的对话框。从数据库中获取的数据可能包含多个数据。所以我必须在 for 循环中显示对话框。但对话框仅显示数据库中的第一行。这里是代码

cursor = sqldb.query(Database_Handler.dbdectab, null,"((" + Database_Handler.gendtime + "<='" + after_1hr + "' and " + Database_Handler.gendtime + ">='" + before_1hr + "') and (" 
            + Database_Handler.calused + "='Gregorian' or " + Database_Handler.calused + "='both')) ", null, null, null, null);
    notif_count = cursor.getCount();
    //dec_name_ctr_builder = new StringBuilder("");
    if(notif_count>0)
    {
        dialog1 = new Dialog(this);
        cursor.moveToFirst();
        do
        {
            dec_name =cursor.getString(cursor.getColumnIndex(Database_Handler.decname));

            dialog1.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog1.setContentView(R.layout.custom_dialog_alert);

            TextView tv_alert = (TextView)dialog1.findViewById(R.id.txt_alert);
            tv_alert.setText( dec_name );
            Button yes = (Button) dialog1.findViewById(R.id.btn_yes);
            Button no = (Button) dialog1.findViewById(R.id.btn_no);

            yes.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v) 
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(donateurl));
                    startActivity(intent);
                    dialog1.dismiss();
                    cursor.close();
                    sqldb.close();
                    finish();
                }
            });
            no.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v)
                {
                    dialog1.dismiss();
                    cursor.close();
                    sqldb.close();
                    finish();
                }
            });
            dialog1.show();
        }while(cursor.moveToNext());
4

3 回答 3

0

Android 对话框不是模态的(也就是说,它们不会阻止后台进程)。因此您的工作是异步完成的,并且根据:

罗曼人

We've designed Android to prevent developers from writing synchronous dialogs so you don't really have much of a choice.

因此,您不能在使用 Dialog 之间阻止 while 循环执行。

于 2013-03-01T16:38:22.953 回答
0

Karan_Rana 是对的。对于您的答案,最简单的解决方案是将结果存储在其他地方,并在每次留下一些数据并且用户单击上一个对话框按钮时显示一个新对话框。

于 2013-03-01T16:57:22.690 回答
0

我知道这有点晚了,但我曾经遇到过类似的问题。我使用递归来循环一个对话框。我的情况很独特,因为我需要在应用程序启动期间检测互联网连接。因此,这种方法可能不适合您。但是我能够在没有 for 循环和阻塞主 UI 线程的情况下实现该解决方案。因为我在启动屏幕上,所以我不需要其他 UI,所以我会简单地再次调用对话框,直到用户选择“退出”。

我有一个启动画面,如果检测到网络连接,它只会继续应用程序的登陆活动。

下面的示例代码演示了这个概念。请注意,有自定义方法,但您应该知道从 onClick 方法中再次调用提示。

protected void onCreate(Bundle savedInstanceState) {
    if (isNetworkAvailable()) {
       launchApp();
    } else {
        retryPrompt();
    }

}

private void retryPrompt() {
        if (isNetworkAvailable()) {
            launchApp();
        } else {
            final ConfirmDialog dialog = new ConfirmDialog.CustomAlertBuilder(this,
                    "Internet Connection",
                    "Internet Connection not detected. Please check your connection.",
                    "Retry").
                    setNegBtnLabel("Quit").
                    setCustomCallback(new CustomDialogCallback() {
                        @Override
                        public void onClickPositiveBtn(DialogInterface dialogInterface, int which) {
                            // go around again.
                            retryPrompt(); // <<== Call method recursively
                        }

                        @Override
                        public void onClickNegativeBtn(DialogInterface dialogInterface, int which) {
                            // abort app.
                            finish();
                        }
                    }).build();
            dialog.show();
        }
    }
于 2020-08-28T05:48:17.337 回答