Возврат данных из диалогового окна, отображаемых пользователю в Android - PullRequest
0 голосов
/ 30 декабря 2010

Вот соответствующий код:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case SORT_MENU:
        showDialog(ORDER_DIALOG);
        showDialog(COLUMNS_DIALOG);

        String orderBy = bundle.getString("column") + bundle.getString("order");

        break;
    }
    return false;
}
@Override
protected Dialog onCreateDialog(int id) {
    Dialog dialog;
    final String[] columns = { "title", "completed" };
    final String[] order = { "Ascending", "Descending" };

    switch (id) {
    case COLUMNS_DIALOG:
        AlertDialog.Builder columnBuilder = new AlertDialog.Builder(this);
        columnBuilder.setTitle("Columns");
        columnBuilder.setItems(columns, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                bundle.putString("column", columns[which]);

                dialog.dismiss();
            }
        });
        dialog = columnBuilder.create();
        break;
    case ORDER_DIALOG:
        AlertDialog.Builder orderBuilder = new AlertDialog.Builder(this);
        orderBuilder.setTitle("Order");
        orderBuilder.setItems(order, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String orderS;
                if (order[which].equalsIgnoreCase("Ascending"))
                    orderS = "ASC";
                else
                    orderS = "DESC";

                bundle.putString("order", orderS);

                dialog.dismiss();
            }
        });
        dialog = orderBuilder.create();
        break;
    default:
        dialog = null;
        break;
    }

    return dialog;
}

Я знаю, что диалог является асинхронным из основного потока пользовательского интерфейса. Итак, звонки, подобные этим:

showDialog(ORDER_DIALOG);
showDialog(COLUMNS_DIALOG);
String orderBy = bundle.getString("column") + bundle.getString("order");

Только в результате orderBy будет нулевым. Есть ли способ заставить orderBy дождаться окончания обоих диалогов? Даже если dialog.isShowing() равно false, это может быть связано с тем, что диалог уже завершен или даже не запущен.

1 Ответ

2 голосов
/ 30 декабря 2010

В этом случае вы должны переопределить и перехватить DialogInterface.OnClickListener и, исходя из его реализации, установить значение orderBy.На самом деле, это лучший подход:

case SORT_MENU:
    showDialog(ORDER_DIALOG);
    break;

Затем на onCreateDialog:

case ORDER_DIALOG:
    AlertDialog.Builder orderBuilder = new AlertDialog.Builder(this);
    orderBuilder.setTitle("Order");
    orderBuilder.setItems(order, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String orderS;
            if (order[which].equalsIgnoreCase("Ascending"))
                orderS = "ASC";
            else
                orderS = "DESC";

            bundle.putString("order", orderS);
            dialog.dismiss();
            showDialog(COLUMNS_DIALOG); // <-- NEW!!!
        }
    });
    dialog = orderBuilder.create();
    break;

Опять на onCreateDialog:

case COLUMNS_DIALOG:
    AlertDialog.Builder columnBuilder = new AlertDialog.Builder(this);
    columnBuilder.setTitle("Columns");
    columnBuilder.setItems(columns, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            bundle.putString("column", columns[which]);
            dialog.dismiss();
            configureString(); // <-- NEW!
        }
    });
    dialog = columnBuilder.create();
    break;

Где-то еще:

private void configureString(){
    String orderBy = bundle.getString("column") + bundle.getString("order");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...