46

I am trying to put some loooong text into an AlertDialog. The only issue the default font size that is really too big, so I want to make it smaller.

Here are all the workaround I tried and their issues.

Workaround 1) Using a TextView and 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();

Issues: Layout is not scrolling

Workaround 2) making TextView scrollable.

message.setMovementMethod(LinkMovementMethod.getInstance());

Issues: Layout is scrolling, bute there is no "inertia" (don't know how to call that.. But I guess you understand.)

Workaround 3) Using a Scrollview.

That's what I am going to try, but I cannot believe there are no easier solutions...

Waza_Be
  • 39,407
  • 49
  • 186
  • 260

7 Answers7

127

You can actually get access to the message's TextView pretty easily, and then change it's size. I tested with a bigger size, but you could use whatever size you want. The text will scroll nicely as it already does. The view's id is 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);

This is probably a cleaner solution, though I'm not sure if there's a risk that the TextView could be null or not.

CopsOnRoad
  • 237,138
  • 77
  • 654
  • 440
Gregory
  • 4,384
  • 1
  • 25
  • 21
28

I am using the following code to change the title and message text for AlertDialog…

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

… making sure that I check for null in my setTitleFont and setBodyFont methods.

dakab
  • 5,379
  • 9
  • 43
  • 67
Sileria
  • 15,223
  • 4
  • 49
  • 28
  • This worked for getting the title View (thanks!), but once I got it I could only set two fonts: the standard font, and a tiny font (with 11.0 for the value). – Stephen Hosking Apr 19 '13 at 13:41
  • This worked for me to set a font from assets folder to the title of the alert box. Good one! – jmacedo Jul 10 '13 at 20:18
  • 1
    Thanks a lot! Using this I was able to change the title font size as follows: int alertTitle = context.getResources().getIdentifier("alertTitle", "id", "android"); View title = dialog.findViewById(alertTitle); if (title != null && title instanceof TextView) { ((TextView) title).setTextSize(14); } – Steven L Sep 08 '13 at 21:25
  • 2
    what is the difference between these two methods of getting reference to the id. Why is there no android.R.id.alertTitle? – Lv99Zubat Mar 08 '16 at 21:12
  • 3
    This solution doesn't seem to work anymore with the recent updates. findViewById() always returns null. :-( – doctorram Jan 29 '18 at 17:36
  • If you're using `android.support.v7.app.AlertDialog`, you have to use `android.support.v7.appcompat.R.id.alertTitle` otherwise use `android.R.id.title` – Arturo Mejia Nov 28 '18 at 15:23
  • No more working in 2020. Using custom style is the only way to workout. – Sam Chen Feb 11 '20 at 14:34
8

For Buttons:

  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();
ganjaam
  • 1,030
  • 3
  • 17
  • 29
M. Usman Khan
  • 3,689
  • 1
  • 59
  • 69
  • Not sure why this isn't getting any upvotes. It may not be an answer to the OP's direct question but as soon as you make the message bigger/smaller, you'll may well want to make the button text bigger/smaller. This seems like a nice, natural (alright, at least javascript-y) way to accomplish the task if it has to be done at runtime anyway. I combined this with the accepted good answer (http://stackoverflow.com/a/6563075/165164) and put those two lines inside the listener. Also, didn't bother with the getDimen call, just set a size. Don't forget to declare ad final! – Anne Gunn Jul 20 '16 at 18:31
5

Here is my solution... you need to create the scroll container, then add the TextView inside the ScrollView just as you would in the XML layout.

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);
kenyu73
  • 671
  • 6
  • 16
1

This works in 2020. I have tested this in 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();
Jeferex
  • 53
  • 4
0

You can solve this issue by using SpannableStringBuilder instead of a string.

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

sean
  • 31
  • 4
0
               AlertDialog.Builder builder = new 
                AlertDialog.Builder(YourActivity.this);
                builder.setTitle("Your Title");
                builder.setMessage("Your Message");
                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // Your Positive Function
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // Your Negative Function
                    }
                });
                builder.show();