2015-06-09 7 views
16

ich diese Codes für Android (Java) Programmierung verwenden zum Zentrum:align Alertdialog Tasten

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 die Schaltfläche machen Zentrum? Wie Sie sehen, versuche ich, die Schaltfläche mit Gravity.CENTER_HORIZONTAL (auch .CENTER) an die Adresse anzupassen, aber nichts ändert sich. Der Knopf ist fast in der richtigen Position.

Antwort

9

Das ist für mich gearbeitet:

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); 
+0

Was ist Referenz 'positiveBtn'? – t0m

+0

Funktioniert das tatsächlich? – zygimantus

+0

Funktioniert nicht unter Android 7.1.1, aber die Lösung von @ Scott Brown funktioniert einwandfrei. – mtronics

1

Ich nehme an, dass Sie den AlertDialog aus der Support-Bibliothek verwenden.

Wenn das der Fall ist, ersetzen Sie Ihren Import in android.app.AlertDialog.

22

Methode der Verwendung CRTN, sondern die LayoutParam Schwerkraft zu verändern, seine Breite zu ViewGroup.LayoutParams.MATCH_PARENT ändern;

+2

Dies funktioniert, Danke –

+0

Funktioniert gut. Superfein zu faulen Leuten wie mir: Ersetzen Sie die Zeile durch

0

Verwenden Sie android.support.v7.app.AlertDialog, die Ihre positiven und negativen Tasten in der Mitte ausrichten.

android.app.AlertDialog platziert die Schaltfläche in den oberen 16dp Platz im unteren Bereich verlassen.

2

Versuchte crtn Methode und Scott Browns Modifikation, beide machten nicht, wie ich mochte.

Die Lösung von crtn hat das Erscheinungsbild der Schaltflächen für mich überhaupt nicht verändert (ich benutze android.R.style.Theme_Material_Light_Dialog) und Scott Browns Lösung ließ meine positive Schaltfläche über die Kante des Dialogelternteils hinausreichen.

Für Theme_Material_Light_Dialog sind die Schaltflächen in einer LinearLayout Unterklasse enthalten, die eine leere Ansicht als 2. Element (Index 1) verwendet, um die Schaltflächen nach rechts zu drücken.

Ich packe die Button ref wie CRTN tut:

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

Aber dann habe ich die leftSpacer zu View.GONE und die Schwerkraft der Eltern zu CENTER_HORIZONTAL

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

Dies hat den Vorteil, dass es doesn brechen Sie nicht das Button-Stacking-Verhalten des Dialogs. Der Nachteil ist, dass wenn sich das interne Layout ändert, es bricht, also YMMV.

1

Wenn Sie positive und negative Tasten zur gleichen Zeit (Large &-Center) haben wollen, können Sie so etwas wie folgt 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);