Изменение размера шрифта в AlertDialog

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

Вот все обходные пути, которые я пробовал, и их проблемы.

Обходной путь 1) Использование TextView и myView.setTextSize(12);

final TextView myView = new TextView(getApplicationContext());
myView.setText(myLongText);
myView.setTextSize(12);
final AlertDialog d = new AlertDialog.Builder(context)
    .setPositiveButton(android.R.string.ok, null)
.setTitle(myTitle)
.setView(myView)
.create();

Проблемы: макет не прокручивается

Обходной путь 2) сделать TextView прокручиваемым.

message.setMovementMethod(LinkMovementMethod.getInstance());

Проблемы: макет прокручивается, но нет «инерции» (не знаю, как это назвать.. но, думаю, вы понимаете).

Обходной путь 3) Использование прокрутки.

Вот что я собираюсь попробовать, но я не могу поверить, что нет более простых решений...


person Waza_Be    schedule 03.07.2011    source источник


Ответы (6)


На самом деле вы можете довольно легко получить доступ к TextView сообщения, а затем изменить его размер. Я тестировал с большим размером, но вы можете использовать любой размер, который вы хотите. Текст будет хорошо прокручиваться, как это уже происходит. id представления равно android.R.id.message

    AlertDialog dialog = new AlertDialog.Builder(this).setMessage("Hello world").show();
    TextView textView = (TextView) dialog.findViewById(android.R.id.message);
    textView.setTextSize(40);

Это, вероятно, более чистое решение, хотя я не уверен, есть ли риск того, что TextView может быть null или нет.

person Gregory    schedule 03.07.2011
comment
ну, текстовый объект textView кажется нулевым - person gaara87; 03.09.2012
comment
Вы должны вызвать setMessage() при построении диалога, иначе текст сообщения не будет отображаться в первую очередь. - person Some Noob Student; 21.11.2012
comment
На самом деле вам тоже нужно вызвать show(), иначе TextView не будет. Если вы хотите также масштабировать кнопки, используйте android.R.id.button1 и т. д. - person Sebastian; 30.03.2013
comment
См. stackoverflow.com/a/18767270/2914140, чтобы понять, почему textView может иметь значение null. - person CoolMind; 22.04.2016
comment
Как изменить этот шрифт, если у него есть только AlertDialog.Builder объект? - person zygimantus; 02.10.2016
comment
Как насчет размера Title сейчас (android.R.id.message для поля сообщения AlertDialog). Какой идентификатор выделен для Title? - person CopsOnRoad; 14.11.2017

Я использую следующий код, чтобы изменить заголовок и текст сообщения для AlertDialog…

final int alertTitle = ctx.getResources().getIdentifier("alertTitle", "id", "android");
setTitleFont((TextView) dlg.findViewById(alertTitle));
setBodyFont((TextView) dlg.findViewById(android.R.id.message));

… убедиться, что я проверяю null в своих методах setTitleFont и setBodyFont.

person Sileria    schedule 07.02.2012
comment
Это сработало для получения заголовка View (спасибо!), но как только я его получил, я смог установить только два шрифта: стандартный шрифт и крошечный шрифт (со значением 11.0). - person Stephen Hosking; 19.04.2013
comment
Это сработало для меня, чтобы установить шрифт из папки с ресурсами в заголовок окна предупреждения. Неплохо! - person jmacedo; 11.07.2013
comment
Большое спасибо! Используя это, я смог изменить размер шрифта заголовка следующим образом: int alertTitle = context.getResources().getIdentifier(alertTitle, id, android); Заголовок представления = dialog.findViewById(alertTitle); if (title != null && title instanceof TextView) { ((TextView) title).setTextSize(14); } - person Steven L; 09.09.2013
comment
в чем разница между этими двумя методами получения ссылки на идентификатор. Почему нет android.R.id.alertTitle? - person lv99Zubat; 09.03.2016
comment
Это решение, похоже, больше не работает с последними обновлениями. findViewById() всегда возвращает null. :-( - person doctorram; 29.01.2018
comment
Если вы используете android.support.v7.app.AlertDialog, вы должны использовать android.support.v7.appcompat.R.id.alertTitle, иначе используйте android.R.id.title - person Arturo Mejia; 28.11.2018
comment
В 2020 году работы больше не будет. Единственный способ тренироваться — использовать собственный стиль. - person Sam Chen; 11.02.2020

Для кнопок:

  final AlertDialog ad = new AlertDialog.Builder(mainScreen)
.setPositiveButton("OK", null) 
.setNegativeButton("Cancel", null).create();

ad.setOnShowListener(new DialogInterface.OnShowListener() {
                                            @Override
                                            public void onShow(DialogInterface dialog) {
                                                int textSize = (int) Helper.getDimen(mainScreen, R.dimen.textSize12);
                                                ad.getButton(Dialog.BUTTON_POSITIVE).setTextSize(textSize);
                                                ad.getButton(Dialog.BUTTON_NEGATIVE).setTextSize(textSize);
                                            }


                                      });

ad.show();
person M. Usman Khan    schedule 09.06.2016
comment
Не уверен, почему это не получает голосов. Это может быть не ответ на прямой вопрос ОП, но как только вы сделаете сообщение больше/меньше, вы вполне можете захотеть сделать текст кнопки больше/меньше. Это кажется хорошим, естественным (хорошо, по крайней мере, javascript-y) способом выполнить задачу, если ее все равно нужно выполнять во время выполнения. Я объединил это с принятым хорошим ответом (stackoverflow.com/a/6563075/165164) и поместил эти две строки внутри слушатель. Кроме того, не беспокойтесь о вызове getDimen, просто установите размер. Не забудьте объявить объявление final! - person Anne Gunn; 20.07.2016

Вот мое решение... вам нужно создать контейнер прокрутки, а затем добавить TextView внутри ScrollView так же, как в макете XML.

AlertDialog alertDialog = new AlertDialog.Builder(this).create();
String str = getString(R.string.upgrade_notes); 
final ScrollView s_view = new ScrollView(getApplicationContext());
final TextView t_view = new TextView(getApplicationContext());
t_view.setText(str);
t_view.setTextSize(14);     
s_view.addView(t_view);
alertDialog.setTitle("Upgrade notes!");
alertDialog.setView(s_view);
person kenyu73    schedule 13.10.2011

Вы можете решить эту проблему, используя SpannableStringBuilder вместо строки.

http://www.android--tutorials.com/2016/10/android-change-alertdialog-title-text_21.html

person sean    schedule 14.03.2018

Это работает в 2020 году. Я тестировал это на Android 10.

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.YourStyle) //Style is only needed if you want to customize look&feel
            .setTitle(R.string.title)
            .setMessage(R.string.message)
            .setPositiveButton(R.string.accept, null);
    AlertDialog alertDialog = builder.create();
    alertDialog.setOnShowListener(dialog -> {
        //The following is to style dialog message
        TextView message = alertDialog.findViewById(android.R.id.message);
        if (message != null) {
            message.setTextSize(12);
            message.setTextColor(getColor(R.color.yellow));
        }
        //The following is to style dialog title. Note that id is alertTitle
        TextView title = alertDialog.findViewById(R.id.alertTitle);
        if (title != null) {
            title.setTextColor(getColor(R.color.black));
        }
    });
    alertDialog.show();
person Jeferex    schedule 15.10.2020