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

18

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

    
задан Micah Hainline 12.07.2012 в 22:11
источник
  • Я бы порекомендовал, чтобы вы этого не делали. Было бы странно, если бы у большинства из них были отображены ОК / Отмена, но в одном приложении это будет Cancel / OK. Лучше быть последовательным, на мой взгляд. –  kabuko 12.07.2012 в 22:26
  • См. выше: «Почему я хочу это сделать, это еще одно обсуждение целиком» –  Micah Hainline 13.07.2012 в 05:16

6 ответов

16

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

  

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

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

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

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

    
ответ дан thegrinner 12.07.2012 в 22:18
  • Это было полезно, но, похоже, что многие из телефонов с 4.0 и выше все еще не имеют кнопки на обратном порядке. Все, что я могу сказать, это если версия сборки> = 4.0, то порядок кнопок МОЖЕТ быть Отмена / ОК –  Micah Hainline 26.07.2012 в 15:59
  • в 4.0.3 порядок отрицательных / положительных изменений на основе текста кнопки –  max4ever 11.01.2013 в 12:13
  • Я вижу «Нейтральный» - «Негативный» - «Положительный» порядок слева направо в диалоговом окне оповещения и оповещении о поддержке. Разве они передумали? –  sakis kaliakoudas 01.02.2016 в 00:33
  • Я протестировал на нем мой результат теста - Android изменил порядок кнопок от API 11 Honeycomb. Почему отличается от вашей ICS (API14)? На устройствах до сота порядок кнопок (слева направо) был ПОЗИТИВНО - НЕЙТРАЛЬНО - НЕГАТИВНО. На новых устройствах, использующих тему Голо, порядок кнопок (слева направо) теперь НЕГАТИВНО - НЕЙТРАЛЬНО - ПОЗИТИВНО. Вы можете обратиться к ссылке: stackoverflow.com/questions/11401951/... –  Dylan 04.02.2016 в 11:21
  • ... и теперь (6.0) порядок нейтрален - - - Отрицательный положительный. –  Rawling 12.07.2016 в 11:52
7

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

    // 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);
    }
    
ответ дан 林奕忠 08.08.2014 в 04:50
  • Это работает для вас на устройствах до 3.0? –  jagmohan 22.11.2014 в 11:48
  • Да, это работа над версией Android8 (2.2) для Android. –  林奕忠 23.11.2014 в 09:13
  • Он работает, и я думаю, что это должен быть принятый ответ. Спасибо! –  jagmohan 23.11.2014 в 09:41
4

Вы можете увеличить 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);
        }
    }

}
    
ответ дан CelinHC 03.12.2013 в 12:28
  • См. предыдущий комментарий: «похоже, что у многих телефонов с 4.0 и выше все еще нет кнопки на порядок. Все, что я могу сказать, это если версия сборки> = 4.0, то порядок кнопок МОЖЕТ быть отменен / ОК " –  Micah Hainline 03.12.2013 в 17:41
1

Я создал решение для принудительного упорядочения кнопок для любой версии 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, чтобы иметь возможность восстановить состояние диалога при восстановлении активности.

    
ответ дан rude 26.06.2013 в 16:49
0

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

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

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

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

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

ответ дан willkernel 05.04.2017 в 06:03