web-dev-qa-db-fra.com

aligner les boutons AlertDialog sur le 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 de savoir comment centrer le bouton? Comme vous le voyez, j'essaie d'aligner le bouton sur cnenter en utilisant Gravity.CENTER_HORIZONTAL (également .CENTER) mais rien ne change. Le bouton est presque en bonne position.

20
Babak.Abad

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);
11
ckd

Utilisez la méthode de crtn, mais au lieu de changer la gravité de LayoutParam, modifiez sa largeur en ViewGroup.LayoutParams.MATCH_PARENT;

26
Scott Brown

Si vous voulez avoir des boutons positifs et négatifs en même temps (grand et centre), 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);
8
Ali_dev

J'ai essayé la méthode de crtn et la modification de Scott Brown, les deux n'ont pas rendu ce que j'aimais. 

la solution de crtn n'a pas du tout changé l'apparence des boutons (j'utilise Android.R.style.Theme_Material_Light_Dialog) et la solution de Scott Brown a permis à mon bouton positif de s'étendre au-delà du bord du dialogue parent.

Pour Theme_Material_Light_Dialog, les boutons sont contenus dans une sous-classe LinearLayout qui utilise une vue vierge en tant que deuxième élément (index 1) pour pousser les boutons à droite.

Je saisis le Button ref comme le fait crtn:

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

Mais ensuite, j'ai défini leftSpacer sur View.GONE et la gravité du parent sur CENTER_HORIZONTAL.

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

Cela présente l'avantage de ne pas altérer le comportement d'empilement des boutons de la boîte de dialogue. L'inconvénient est que si la mise en page interne change, cela va casser, donc YMMV.

3
frank

Voici quelque chose qui fonctionne vraiment.

Le parent des 3 boutons (neutre, positif et négatif) est ButtonBarLayout, qui étend LinearLayout. Pour centrer une vue dans LinearLayout, le poids, la largeur et la mise en page (sans gravité) sont importants, et ces codes fonctionnent 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
Lucas YU

Je suppose que vous utilisez AlertDialog de la bibliothèque de support.

Si tel est le cas, essayez de remplacer votre import vers Android.app.AlertDialog.

1
hpereira

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

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

0
Velmurugan V

Vous pouvez définir les boutons positif, négatif et neutre, masquer les boutons positif et neutre et placer le bouton négatif là où le bouton neutre est censé être (centre) à l'aide de 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
tick t