0

我想创建一个带有文本字段和按钮的 dialogBu​​ilder。这个想法是让程序等待任何进一步的操作,直到输入字段中的文本并单击 OK 按钮。下面是代码:

private static final Object wait = new int[0];
private static String result = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Handler h = new Handler();
    final Context context = MainActivity.this;
    h.post(new Runnable() {

        public void run() {
            final Builder dialogBuilder = new AlertDialog.Builder(context);
            dialogBuilder.setTitle(R.string.app_name);
            final LinearLayout panel = new LinearLayout(context);
            panel.setOrientation(LinearLayout.VERTICAL);
            final TextView label = new TextView(context);
            label.setId(1);
            label.setText(R.string.app_name);
            panel.addView(label);

            final EditText input = new EditText(context);
            input.setId(2);
            input.setSingleLine();
            input.setInputType(InputType.TYPE_CLASS_TEXT
                    | InputType.TYPE_TEXT_VARIATION_URI
                    | InputType.TYPE_TEXT_VARIATION_PHONETIC);
            final ScrollView view = new ScrollView(context);
            panel.addView(input);
            view.addView(panel);

            dialogBuilder
                    .setCancelable(true)
                    .setPositiveButton(R.string.app_name,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    result = input.getText().toString();

                                    synchronized (wait) {
                                        wait.notifyAll();
                                    }

                                    dialog.dismiss();
                                }
                            }).setView(view);

            dialogBuilder.setOnCancelListener(new OnCancelListener() {
                public void onCancel(DialogInterface arg0) {
                    result = null;
                    synchronized (wait) {
                        wait.notifyAll();
                    }
                }
            });
            dialogBuilder.create().show();
        }

    });

    String localResult = null;
    try {
        synchronized (wait) {
            Log.d("Waiting", "Waiting " + localResult);
            wait.wait();
        }
        localResult = result;
        result = null;
        if (localResult == null) {
            // user is requesting cancel
            throw new RuntimeException("Cancelled by user");
        }
        Log.d("RESULT ", "RESULT " + localResult);
    } catch (InterruptedException e) {
        localResult = result;
        result = null;

        if (localResult == null) {
            // user is requesting cancel
            Log.d("CANCELED ", "CANCELED " + localResult);
            throw new RuntimeException("Cancelled by user");
        }
    }
    Log.d("RESULT AFTER THE DIALOG", "RESULT AFTER THE DIALOG " + result);
}

该程序将进入 Log.d("Waiting", "Waiting" + localResult); 在那之后只是等待。活动窗口上未显示任何对话框生成器。使用debug模式,看到程序流程没有进入run()方法,但是Handler.post()的值是true。由于这个原因,对话框没有显示,程序正在等待。

我试图删除等待的时刻(删除 Handler.post()),只是为了看看对话框是否会显示,它显示并且一切都很好,但结果不是我需要的 - 我希望程序等待对话框的输入......我真的没有想法。

请你给我一些建议,因为我真的没有想法。

非常感谢!

4

2 回答 2

1

Handlers不要在单独的线程中运行。所以当你打电话时wait()

    synchronized (wait) {
        Log.d("Waiting", "Waiting " + localResult);
        wait.wait();
    }

它无限期地等待,因为处理程序与当前线程在同一线程上运行。您Runnable只能在onCreate()方法完成后执行,但这永远不会发生,因为您刚刚调用了wait().

您应该重新考虑您的想法并找到解决方法(例如,只要用户没有输入有效文本,就以通常的方式显示对话框并禁用“确定”按钮)。但是在 UI 线程上调用wait()不能顺利进行。

于 2012-08-07T23:07:27.737 回答
0

您应该在 UI 线程中运行对话框的显示,而不是单独的线程。

一个例子是这样的:

在 onCreate()

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // Display progress dialog when loading contacts
                            dialog = new ProgressDialog(this);
                            // continue with config of Dialog
                        }
                    });

                        // Execute the Asynchronus Task
                        new AsyncTask<Void, Void, Void>() {
                            @Override
                            protected Void doInBackground(Void... params) {
                                // code to execute in background
                                return null;
                            }
                            @Override
                            protected void onPostExecute(Void result) {
                                // Dismiss the dialog after inBackground is done
                                if (dialog != null)
                                    dialog.dismiss();

                                super.onPostExecute(result);
                            }

                        }.execute((Void[]) null);

具体来说,这里发生的是 Dialog 显示在 UI 线程上,然后 AsyncTask 在 Dialog 运行时在后台执行。然后在执行结束时我们关闭对话框。

于 2012-08-07T22:46:49.810 回答