webentwicklung-frage-antwort-db.com.de

richten Sie die AlertDialog-Schaltflächen auf die Mitte aus

Ich verwende diese Codes für die Programmierung von 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;
}

Mein Problem ist, wie man den Button zentriert? Wie Sie sehen, versuche ich, die Schaltfläche mit Gravity.CENTER_HORIZONTAL (auch .CENTER) an cnenter auszurichten. Die Taste befindet sich fast in der richtigen Position.

20
Babak.Abad

Das hat für mich funktioniert: 

    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

Verwenden Sie die Methode von crtn, ändern Sie jedoch nicht die Schwerkraft von LayoutParam, sondern ändern Sie die Breite in ViewGroup.LayoutParams.MATCH_PARENT;

26
Scott Brown

Wenn Sie positive und negative Schaltflächen gleichzeitig haben möchten (groß und zentriert), können Sie Folgendes verwenden:

 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

Ich habe die Methode von Crtn und die Modifikation von Scott Brown ausprobiert. 

die Lösung von crtn hat das Erscheinungsbild der Schaltflächen für mich überhaupt nicht geändert (ich verwende Android.R.style.Theme_Material_Light_Dialog), und die Lösung von Scott Brown ließ meine positive Schaltfläche über den Rand des übergeordneten Dialogs hinausragen.

Bei Theme_Material_Light_Dialog befinden sich die Schaltflächen in einer LinearLayout-Unterklasse, die eine leere Ansicht als zweites Element (Index 1) verwendet, um die Schaltflächen nach rechts zu drücken.

Ich greife den Button ref wie crtn:

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

Dann habe ich den leftSpacer auf View.GONE und die Schwerkraft der Eltern auf CENTER_HORIZONTAL gesetzt

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

Dies hat den Vorteil, dass das Schaltflächenstapelverhalten des Dialogfelds nicht beeinträchtigt wird. Der Nachteil ist, dass, wenn sich das interne Layout ändert, es kaputt geht, so YMMV.

3
frank

Hier ist etwas wirklich Arbeit.

Die übergeordnete der 3 Schaltflächen (neutral, positiv und negativ) ist ButtonBarLayout, wodurch LinearLayout erweitert wird. Um eine Ansicht in LinearLayout zu zentralisieren, sind Gewicht, Breite und layout_gravity (aber nicht die Schwerkraft) wichtig, und dieser Code funktioniert einwandfrei:

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

Ich gehe davon aus, dass Sie den AlertDialog aus der Support-Bibliothek verwenden.

Wenn dies der Fall ist, versuchen Sie, Ihren Import in Android.app.AlertDialog zu ersetzen.

1
hpereira

Verwenden Sie Android.support.v7.app.AlertDialog, um die positiven und negativen Tasten in der Mitte auszurichten.

Mit Android.app.AlertDialog wird die Schaltfläche oben platziert und der Bereich 16dp bleibt unten.

0
Velmurugan V

Sie können die positiven, negativen und neutralen Schaltflächen festlegen, die positiven und die neutrale Schaltfläche ausblenden und die negative Schaltfläche an der Stelle platzieren, an der sich die neutrale Schaltfläche befindet (Mitte), indem Sie LayoutParams verwenden.

in 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();

in 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