2015-06-09 9 views
16

Io uso questo i codici per Android (Java) Programmazione:pulsanti di allineamento AlertDialog dal centro

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

mio problema è come rendere il centro pulsante? Come puoi vedere, cerco di allineare il pulsante a cnenter usando Gravity.CENTER_HORIZONTAL (anche .CENTER) ma non cambia nulla. Il pulsante è quasi nella giusta posizione.

risposta

9

questo ha funzionato per me: il metodo

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

Ciò che è di riferimento 'positiveBtn'? – t0m

+0

Funziona davvero? – zygimantus

+0

Non funziona su Android 7.1.1 ma la soluzione di @Scott Brown qui sotto funziona perfettamente. – mtronics

1

Presumo che si stia utilizzando AlertDialog dalla libreria Supporto.

In questo caso, provare a sostituire l'importazione in android.app.AlertDialog.

22

Uso di CRTN, ma invece di cambiare la gravità della LayoutParam, modificare la sua larghezza di ViewGroup.LayoutParams.MATCH_PARENT;

+2

Funziona, grazie –

+0

Funziona bene. Per essere superclear alle persone pigre come me: Sostituisci la riga con

0

Utilizzare android.support.v7.app.AlertDialog che allinea i pulsanti positivi e negativi al centro.

android.app.AlertDialog posiziona il pulsante nella parte superiore lasciando 16dp di spazio in basso.

2

Provato il metodo di crtn e la modifica di Scott Brown, entrambi non hanno reso quanto mi piacesse.

La soluzione di crtn non ha cambiato l'aspetto dei pulsanti per me (sto usando android.R.style.Theme_Material_Light_Dialog) e la soluzione di Scott Brown ha fatto sì che il mio pulsante positivo si estendesse oltre il bordo della finestra di dialogo padre.

Per Theme_Material_Light_Dialog i pulsanti sono contenuti in una sottoclasse LinearLayout che utilizza una vista vuota come secondo elemento (indice 1) per spingere i pulsanti a destra.

Afferro il Button ref come CRTN fa:

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

Ma poi ho impostato il leftSpacer per View.GONE e la gravità del genitore per CENTER_HORIZONTAL

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

Questo ha il vantaggio che doesn 'interrompe il comportamento di impilamento dei pulsanti della finestra di dialogo. Lo svantaggio è che se il layout interno cambia, si romperà, quindi YMMV.

1

Se si desidera avere pulsanti positivo e negativo allo stesso tempo (Large & Center), è possibile utilizzare qualcosa di simile:

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); 
Problemi correlati