web-dev-qa-db-fra.com

Dialogue personnalisé sur Android: comment centrer son titre?

Je développe une application Android.

Comment centrer le titre d'une boîte de dialogue personnalisée que j'utilise?

Merci.

63
VansFannel

Je viens de trouver ce post en essayant de comprendre comment faire la même chose. Voici comment je l'ai fait pour quiconque trouve cela à l'avenir.

Le style xml est le suivant:

    <?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>

Et dans mes activités sur la méthode onCreateDialog pour le dialogue que je veux styliser, je crée le dialogue comme suit:

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

Une autre façon de procéder par programme consiste à utiliser 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);
98
LandL Partners

Vous pouvez aussi le faire en code. Supposons que vous ayez un fragment de dialogue, puis ajoutez les lignes de code suivantes.

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

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

Vous pouvez le faire par programme sans affichage personnalisé:

@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);
    }
}

Merci @hesam pour l'idée. Pour la mise en page appcompat, voir Android/sdk/platforms/Android-26/data/res/layout/alert_dialog_title_material.xml

2
soshial

Pour votre DialogFragment personnalisé, vous pouvez faire ceci:

@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
Nail Sharipov

Si vous n'appelez pas AlertDialog.Builder.setIcon() et AlertDialog.Builder.setTitle(), votre boîte de dialogue personnalisée ne montrera pas la vue titre intégrée/par défaut. Dans ce cas, vous pouvez ajouter votre titre personnalisé. Voir:

AlertDialog.Builder.setView(View view)

Dès que c'est vous qui créez cette vue, il est possible d'implémenter tout type d'alignement.

1
Vit Khudenko
TextView titleView = (TextView) dialog.findViewById(Android.R.id.title);
if(titleView != null) {
titleView.setGravity(Gravity.CENTER);
}

Voir cet article de KodeCenter sur la boîte de dialogue Android et AlertDialog pour plus de détails.

1
user7859337

Semblable à la solution @LandL Partners, mais à 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)
0
Jerry Chong

Voici une mauvaise solution…. Développez AlertDialog.Builder et substituez toutes les méthodes (par exemple, setText, setTitle, setView, etc.) pour ne pas définir le texte/titre/vue du dialogue, mais pour créer un nouveau point de vue tout faire là dedans. Ensuite, vous êtes libre de tout styler à votre guise.

Pour clarifier, en ce qui concerne la classe parente, la vue est définie et rien d’autre.

En ce qui concerne votre classe étendue personnalisée, tout est fait dans cette vue.

0
Steven L

Essaye ça:

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

Code complet (en utilisant 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
Vitaly Zinchenko
    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
Ahmad Aghazadeh

Voici quelques conseils de départ pour modifier le titre d'un dialogue: Android - modifier l'affichage du titre personnalisé au moment de l'exécution Je ne sais pas s'il peut être centré (sans avoir essayé). , mais si c'est une vue personnalisée, je suppose que c'est très possible.

0
Vuk