aligner les boutons AlertDialog au centre

j'utilise ces codes pour la programmation Android (Java):

public static MessageBoxResult showOk(
        Context context, String title, String message, String okMessage)
{
    okDialogResult = MessageBoxResult.Closed;

    // make a handler that throws a runtime exception when a message is received
    final Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message mesg)
        {
            throw new RuntimeException();
        }
    };

    AlertDialog.Builder alert = new AlertDialog.Builder(context);
    alert.setTitle(title);
    alert.setMessage(message);

    alert.setPositiveButton(okMessage, new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int whichButton) {
            okDialogResult = MessageBoxResult.Positive;
            handler.sendMessage(handler.obtainMessage());
        }
    });

    AlertDialog dialog = alert.show();


    // align button to center
    Button b = (Button) dialog.findViewById(android.R.id.button1);
    b.setGravity(Gravity.CENTER_HORIZONTAL);

    // loop till a runtime exception is triggered.
    try { Looper.loop(); }
    catch(RuntimeException e2) {}

    return okDialogResult;
}

mon problème est comment faire le centre du bouton? Comme vous le voyez, j'essaie d'aligner le bouton cnenter en utilisant Gravity.CENTER_HORIZONTAL (.CENTER) mais rien ne change. Le bouton est presque dans la bonne position.

20
demandé sur Unheilig 2015-06-10 00:20:39

8 réponses

Cela a fonctionné pour moi :

    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppCompatAlertDialogStyle);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(message);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });


    final AlertDialog dialog = builder.create();
    dialog.show(); //show() should be called before dialog.getButton().


    final Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
    LinearLayout.LayoutParams positiveButtonLL = (LinearLayout.LayoutParams) positiveButton.getLayoutParams();
    positiveButtonLL.gravity = Gravity.CENTER;
    positiveButton.setLayoutParams(positiveButtonLL);
10
répondu ckunder 2016-07-13 12:47:05

utilisez la méthode de crtn, mais au lieu de changer la pesanteur du LayoutParam, changez sa largeur en ViewGroup.LayoutParams.MATCH_PARENT;

25
répondu Scott Brown 2016-11-22 16:53:35

si vous voulez avoir des boutons positifs et négatifs en même temps (Large & Center), vous pouvez utiliser quelque chose comme ceci:

Dialog Positive & Negative Buttons

AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Title");
alertDialog.setMessage("Message");

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Yes",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "No",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                 dialog.dismiss();
            }
         });
alertDialog.show();

Button btnPositive = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
Button btnNegative = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) btnPositive.getLayoutParams();
layoutParams.weight = 10;
btnPositive.setLayoutParams(layoutParams);
btnNegative.setLayoutParams(layoutParams);
6
répondu Ali_dev 2017-08-26 16:22:17

essayé la méthode de crtn et la modification de Scott Brown, les deux ne rendaient pas ce que j'aimais.

la solution de crtn n'a pas changé l'apparence des boutons pour moi (j'utilise android.R.style.Theme_Material_Light_Dialog) et la solution de Scott Brown fait que mon bouton positif s'étend au-delà du bord du dialogue parent.

Theme_Material_Light_Dialog les boutons sont contenus dans un LinearLayout sous-classe qui utilise une vue en blanc comme deuxième élément (index 1) pour appuyer sur les boutons à droite.

je prends l' Button ref comme crtn n':

AlertDialog dialog = bld.create();
dialog.show(); //show() MUST be called before dialog.getButton
Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);

mais ensuite j'ai mis le leftSpacer à afficher.GONE and the parent's gravity to CENTER_HORIZONTAL

LinearLayout parent = (LinearLayout) positiveButton.getParent();
parent.setGravity(Gravity.CENTER_HORIZONTAL);
View leftSpacer = parent.getChildAt(1);
leftSpacer.setVisibility(View.GONE);

ceci a l'avantage de ne pas casser le comportement d'empilage des boutons de la boîte de dialogue. L'inconvénient est que si la disposition interne change, elle se casse, donc YMMV.

2
répondu frank 2017-03-01 01:07:02

voici quelque chose qui fonctionne vraiment.

le parent des 3 boutons (neutre, positif et négatif) est ButtonBarLayout,qui s'étend linéairement. Pour centraliser une vue dans LinearLayout, poids, largeur et layout_gravity (mais pas la gravité) est important, et ce code fonctionne parfaitement:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); //create a new one
layoutParams.weight = 1.0 f;
layoutParams.gravity = Gravity.CENTER; //this is layout_gravity
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setLayoutParams(layoutParams);
2
répondu Lucas YU 2018-08-07 08:52:54

je présume que vous utilisez L'AlertDialog de la bibliothèque de soutien.

Si c'est le cas, essayez de remplacer votre import android.App.AlertDialog.

1
répondu hpereira 2015-07-26 16:56:29

Utiliserandroid.support.v7.app.AlertDialog qui alignera vos boutons positif et négatif au centre.

android.app.AlertDialog placera le bouton dans le haut en laissant un espace de 16dp dans le bas.

0
répondu Velmurugan V 2017-01-10 07:44:51

vous pouvez régler les boutons positif, négatif et neutre, Cacher les boutons positif et neutre, et mettre le bouton négatif où le bouton neutre est censé être(centre) en utilisant LayoutParams.

dans onCreateView:

dialog = builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        })
                 .setPositiveButton(R.string.go_on, new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {

                     }
                 })
                 .setNeutralButton(R.string.do_nothing, new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {

                     }
                 })
                 .create();

dans onStart():

 super.onStart();

    final Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
   positiveButton.setVisibility(View.INVISIBLE);
   final Button neutralButton = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
   neutralButton.setVisibility(View.INVISIBLE);
   final Button negativeButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE);
   negativeButton.setLayoutParams(neutralButton.getLayoutParams());
0
répondu tick t 2018-05-31 11:03:35