Android上的自定义对话框:如何将标题居中?


67

我正在开发一个Android应用程序。

如何将正在使用的自定义对话框的标题居中?

Answers:


58

只是在试图弄清楚如何做相同的事情的同时找到了这篇文章。这是我为将来会发现此问题的其他人所做的方法。

样式xml如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="PauseDialog" parent="@android:style/Theme.Dialog">
            <item name="android:windowTitleStyle">@style/PauseDialogTitle</item>
        </style>

        <style name="PauseDialogTitle" parent="@android:style/TextAppearance.DialogWindowTitle">
            <item name="android:gravity">center_horizontal</item>
        </style>
        <style name="DialogWindowTitle">
        <item name="android:maxLines">1</item>
        <item name="android:scrollHorizontally">true</item>
        <item name="android:textAppearance">@android:style/TextAppearance.DialogWindowTitle</item>
        </style>
    </resources>

And in my activities onCreateDialog method for the dialog I want styled I create the dialog like this:

Dialog pauseDialog = new Dialog(this, R.style.PauseDialog);
pauseDialog.setTitle(R.string.pause_menu_label);
pauseDialog.setContentView(R.layout.pause_menu);

I tried your suggestion but it does not center the title of the Dialog (HTC Wildfire running with Android 2.2.1)... Any ideas? Because intuitively your solution makes sense :)
Ready4Android

Sorry, no idea. I've tested it on my Ideos and the emulator with 1.6 and 2.2 with no problems.
ChrisJD

1
there is no "parent="@android:style/DialogWindowTitle"".
Hesam

2
Nice digging. You can actually simplify it to two layers. Sorry for the poor formatting... <style name="CustomDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowTitleStyle">@style/MyDialogWindowTitle</item> </style> <style name="MyDialogWindowTitle" parent="@android:style/TextAppearance.DialogWindowTitle"> <item name="android:textColor">@android:color/white</item> <item name="android:gravity">center_horizontal</item> </style>
ProjectJourneyman

1
This is not correct answer.Correct one done by @LandL Partners
Prakash

111

Another way that this can be done programatically is using the setCustomTitle():

// Creating the AlertDialog with a custom xml layout (you can still use the default Android version)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.viewname, null);
builder.setView(view);

TextView title = new TextView(this);
// You Can Customise your Title here 
title.setText("Custom Centered Title");
title.setBackgroundColor(Color.DKGRAY);
title.setPadding(10, 10, 10, 10);
title.setGravity(Gravity.CENTER);
title.setTextColor(Color.WHITE);
title.setTextSize(20);

builder.setCustomTitle(title);

R.layout.viewname In this layout what has to be included?? only TextView??
DroidLearner

The whole view section does not need to be included, this is only if you want to customise the default view of the AlertDialog. I do believe that it has to be a TextView.
Raj

I get a grey color border for this textview. How do I remove that? I have tried title.setBackgroundResource(R.drawable.black_border); But this doesn't help. @LandLPartners
user1051505

If you want to remove it from the entire AlertDialog then you can reference this -stackoverflow.com/questions/8051581/….
Raj

best answer always!!
angel

8

You can do it in code as well. Assume you have dialog fragment then add following lines of code.

@Override
public void onStart()
{
    super.onStart();

    TextView textView = (TextView) this.getDialog().findViewById(android.R.id.title);
    if(textView != null)
    {
        textView.setGravity(Gravity.CENTER);
    }
}

Not working for me either. findViewById(android.R.id.title); returns null.
Alyoshak

it worked for me. I tried to get the TextView just after Dialog object instantiation.
Dhruvam Gupta

2

For your custom DialogFragment you can do this:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    final TextView textView = (TextView) dialog.findViewById(android.R.id.title);
    if(textView != null) {
        textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    }
    return dialog;
}

1
This does not work for me. findViewById(android.R.id.title); returns null.
Alyoshak

2

You can do it programmatically without custom view:

@Override
public void onStart()
{
    super.onStart();

    TextView textViewVanilla = (TextView) this.getDialog().findViewById(android.R.id.title);
    if(textViewVanilla != null)
    {
        textViewVanilla.setGravity(Gravity.CENTER);
    }
    // support for appcompat v7
    TextView textViewAppcompat = (TextView) this.getDialog().findViewById(android.support.v7.appcompat.R.id.alertTitle);
    if(textViewAppcompat != null)
    {
        textViewAppcompat.setGravity(Gravity.CENTER);
    }
}

Thanks @hesam for the idea. For appcompat layout see Android/sdk/platforms/android-26/data/res/layout/alert_dialog_title_material.xml


2

Similar to @LandL Partners solution, but in Kotlin:

val builder = AlertDialog.Builder(this)
val inflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

val view = inflater.inflate(R.layout.viewname, null)
builder.setView(view)
val title = TextView(this)
title.setText("Custom Centered Title")
title.setBackgroundColor(Color.DKGRAY)
title.setPadding(10, 10, 10, 10)
title.setGravity(Gravity.CENTER)
title.setTextColor(Color.WHITE)
title.setTextSize(20)

builder.setCustomTitle(title)

1

If you don't call AlertDialog.Builder.setIcon() and AlertDialog.Builder.setTitle(), then your custom dialog will not show the built-in/default title View. In this case you are able to add your custom title View:

AlertDialog.Builder.setView(View view)

As soon as it is you who create this View it is possible to implement any type of alignment.




0

Here's a nasty solution.... Extend AlertDialog.Builder and override all the methods (eg. setText, setTitle, setView, etc) to not set the actual Dialog's text/title/view, but to create a new view within the Dialog's View do everything in there. Then you are free to style everything as you please.

To clarify, as far as the parent class is concerned, the View is set, and nothing else.

As far as your custom extended class is concerned, everything is done within that view.


0

Try this:

TextView titleText = (TextView) helpDialog.findViewById(R.id.alertTitle);
if(titleText != null) {
    titleText.setGravity(Gravity.CENTER);
}

Full code (using android.support.v7.app.AlertDialog):

 AlertDialog.Builder helpDialogBuilder = new AlertDialog.Builder(context)
        .setTitle(/*your title*/)
        .setMessage(/*your message*/)
        .setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        /*you can do something here*/

                        dialog.dismiss();
                    }
                })
        .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        /*you can do something here*/

                        dialog.dismiss();
                    }
                });

final AlertDialog helpDialog = helpDialogBuilder.create();

helpDialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {

        TextView titleText = (TextView) helpDialog.findViewById(R.id.alertTitle);
        if(titleText != null) {
            titleText.setGravity(Gravity.CENTER);
        }

        TextView messageText = (TextView) helpDialog.findViewById(android.R.id.message);
        if(messageText != null) {
            messageText.setGravity(Gravity.CENTER);
        }
    }
});

helpDialog.show(); 

0
    AlertDialog alertDialog = new AlertDialog.Builder(activity)

            .setMessage(message)
            .create();
    alertDialog.setIcon(R.mipmap.ic_launcher_round);

    @SuppressLint("RestrictedApi")
    DialogTitle titleView=new DialogTitle(activity);
    titleView.setText(title);
    titleView.setPaddingRelative(32,32,32,0);
    alertDialog.setCustomTitle(titleView);

0

In Kotlin, you can do it in 1 line

dialog!!.window!!.attributes = dialog!!.window!!.attributes.apply { dimAmount = 0F }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.