Как установить порядок положительных и отрицательных кнопок в AlertDialog?

Почему я хочу это сделать, это еще одна дискуссия, но мне нужно выяснить, как сделать все мои диалоговые окна с положительной кнопкой справа. Обратите внимание, что в версии 3.0 и ниже кнопки обычно отображаются как "ОК/Отмена", а в 4.0 и выше - "Отмена" / "ОК". Я хочу заставить приложение использовать Cancel/OK самым простым способом. У меня есть много AlertDialogs в приложении.

Ответы

Ответ 1

К сожалению, я не думаю, что вы можете. Однако, чтобы процитировать документация:

Примечание. Вы можете добавить только один тип каждой кнопки в AlertDialog. То есть у вас не может быть более одной "положительной" кнопки. Это ограничивает количество возможных кнопок до трех: положительных, нейтральных и отрицательных. Эти имена технически не имеют отношения к фактической функциональности ваших кнопок, но должны помочь вам отслеживать, что делает что-то.

Итак, вы можете превратить разные кнопки в то, что вы хотите. То, что вы видите здесь, - это порядок, который переключился (заказывая этот ответ):

  • На устройствах до ICS порядок кнопок (слева направо) был ПОЗИТИВНО - НЕЙТРАЛЬНО - НЕГАТИВНО.
  • На новых устройствах, использующих ICS, порядок кнопок (слева направо) теперь НЕГАТИВНО - НЕЙТРАЛЬНО - ПОЗИТИВНО.

Вы можете попробовать проверить Build.VERSION и использовать это, чтобы решить, какая кнопка находится во время выполнения.

Ответ 2

это мое решение. Это работа для меня.

    // Show alertDialog after building
    AlertDialog alertDialog = createAlertDialog(context);
    alertDialog.show();
    // and find positiveButton and negativeButton
    Button positiveButton = (Button) alertDialog.findViewById(android.R.id.button1);
    Button negativeButton = (Button) alertDialog.findViewById(android.R.id.button2);
    // then get their parent ViewGroup
    ViewGroup buttonPanelContainer = (ViewGroup) positiveButton.getParent();
    int positiveButtonIndex = buttonPanelContainer.indexOfChild(positiveButton);
    int negativeButtonIndex = buttonPanelContainer.indexOfChild(negativeButton);
    if (positiveButtonIndex < negativeButtonIndex) {
        // prepare exchange their index in ViewGroup
        buttonPanelContainer.removeView(positiveButton);
        buttonPanelContainer.removeView(negativeButton);
        buttonPanelContainer.addView(negativeButton, positiveButtonIndex);
        buttonPanelContainer.addView(positiveButton, negativeButtonIndex);
    }

Ответ 3

Вы можете расширить AlertDialog.Builder, чтобы заставить порядок:

public class MyDialog extends AlertDialog.Builder {

    public MyDialog(Context arg0) {
        super(arg0);
    }

    @Override
    public Builder setPositiveButton(CharSequence text, OnClickListener listener) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return super.setNegativeButton(text, listener);
        } else {
            return super.setPositiveButton(text, listener);
        }

    }

    @Override
    public Builder setNegativeButton(CharSequence text, OnClickListener listener) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return super.setPositiveButton(text, listener);
        } else {
            return super.setNegativeButton(text, listener);
        }
    }

}

Ответ 4

Я создал решение для принудительного упорядочения кнопок для любой версии Android на любом устройстве.

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

Пожалуйста, проверьте репозиторий GitHub

Вот пример создания и отображения диалога:

 new FixedOrderDialogFragment.Builder()
    .setLeftButtonText(R.string.left)
    .setCenterButtonText(R.string.center)
    .setRightButtonText(R.string.right)
    .setDefaultButton(FixedOrderDialogFragment.BUTTON_RIGHT)
    .setMessage(R.string.message)
    .setTitle(R.string.app_name)
    .create()
 .show(getSupportFragmentManager(), "DEMO");

Обратите внимание: активность владельца должна реализовывать FixedOrderDialogFragment.FixedOrderDialogListener, чтобы иметь возможность восстановить состояние диалога при восстановлении активности.

Ответ 5

Я решил, что могу просто установить текст для положительной кнопки "Отмена", а отрицательный - "ОК", но оказывается, что они находятся в алфавитном порядке.

Ответ 6

  • В AlertDialog buttonPanel три кнопки сортируются по [Нейтральный] [Отрицательный] [Положительный]
  • тогда вы можете установить такие кнопки, как следующие коды

    builder.setNeutralButton( "Негативный", слушатель);

    builder.setNegativeButton( "нейтральный", слушатель);

    builder.setPositiveButton( "Положительный", слушатель);