studio programacion para herramientas desarrollo con avanzado aplicaciones android button alignment android-alertdialog

programacion - manual android studio avanzado



alinear los botones de AlertDialog para centrar (8)

Yo uso estos códigos para la programación de 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; }

Mi problema es ¿cómo centrar el botón? Como ve, trato de alinear el botón para ingresar usando Gravity.CENTER_HORIZONTAL (también .CENTER ) pero nada cambia. El botón está casi en la posición correcta.


Aquí hay algo que realmente funciona.

El padre de los 3 botones (neutral, positivo y negativo) es ButtonBarLayout, que extiende LinearLayout. Para centralizar una vista en LinearLayout, el peso, el ancho y la gravedad del diseño (pero no la gravedad) es importante, y este código funciona perfectamente:

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


El método de Cried de Tried y la modificación de Scott Brown, ambos no mostraron lo que me gustaba.

La solución de crtn no cambió la apariencia de los botones para mí (estoy usando android.R.style.Theme_Material_Light_Dialog ) y la solución de Scott Brown hizo que mi botón positivo se extendiera más allá del borde del diálogo principal.

Para Theme_Material_Light_Dialog los botones están contenidos dentro de una subclase LinearLayout que usa una vista en blanco como su segundo elemento (índice 1) para presionar los botones hacia la derecha.

Agarro el Button ref como lo hace crtn:

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

Pero luego puse el leftSpacer en View.GONE y la gravedad de los padres en CENTER_HORIZONTAL

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

Esto tiene la ventaja de que no rompe el comportamiento de apilamiento de botones del diálogo. La desventaja es que si el diseño interno cambia, se romperá, por lo que YMMV.


Esto funcionó para mí:

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


Puede configurar los botones positivo, negativo y neutral, ocultar los botones positivo y neutral, y colocar el botón negativo donde se supone que debe estar el botón neutral (centro) usando LayoutParams.

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

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


Si desea tener botones positivos y negativos al mismo tiempo (grande y central), puede usar algo como esto:

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


Supongo que está utilizando el AlertDialog de la biblioteca de soporte.

Si ese es el caso, intente reemplazar su importación a android.app.AlertDialog.


Use android.support.v7.app.AlertDialog que alineará sus botones positivo y negativo en el centro.

android.app.AlertDialog colocará el botón en la parte superior, dejando un espacio de 16dp en la parte inferior.


Use el método de crtn, pero en lugar de cambiar la gravedad de LayoutParam, cambie su ancho a ViewGroup.LayoutParams.MATCH_PARENT;