aligner les boutons AlertDialog au 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 comment faire le centre du bouton? Comme vous le voyez, j'essaie d'aligner le bouton cnenter en utilisant Gravity.CENTER_HORIZONTAL
(.CENTER
) mais rien ne change. Le bouton est presque dans la bonne position.
8 réponses
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);
utilisez la méthode de crtn, mais au lieu de changer la pesanteur du LayoutParam, changez sa largeur en ViewGroup.LayoutParams.MATCH_PARENT;
si vous voulez avoir des boutons positifs et négatifs en même temps (Large & Center), vous pouvez utiliser quelque chose comme ceci:
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);
essayé la méthode de crtn et la modification de Scott Brown, les deux ne rendaient pas ce que j'aimais.
la solution de crtn n'a pas changé l'apparence des boutons pour moi (j'utilise android.R.style.Theme_Material_Light_Dialog
) et la solution de Scott Brown fait que mon bouton positif s'étend au-delà du bord du dialogue parent.
Theme_Material_Light_Dialog
les boutons sont contenus dans un LinearLayout
sous-classe qui utilise une vue en blanc comme deuxième élément (index 1) pour appuyer sur les boutons à droite.
je prends l' Button
ref comme crtn n':
AlertDialog dialog = bld.create();
dialog.show(); //show() MUST be called before dialog.getButton
Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
mais ensuite j'ai mis le leftSpacer à afficher.GONE and the parent's gravity to CENTER_HORIZONTAL
LinearLayout parent = (LinearLayout) positiveButton.getParent();
parent.setGravity(Gravity.CENTER_HORIZONTAL);
View leftSpacer = parent.getChildAt(1);
leftSpacer.setVisibility(View.GONE);
ceci a l'avantage de ne pas casser le comportement d'empilage des boutons de la boîte de dialogue. L'inconvénient est que si la disposition interne change, elle se casse, donc YMMV.
voici quelque chose qui fonctionne vraiment.
le parent des 3 boutons (neutre, positif et négatif) est ButtonBarLayout,qui s'étend linéairement. Pour centraliser une vue dans LinearLayout, poids, largeur et layout_gravity (mais pas la gravité) est important, et ce code fonctionne 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);
je présume que vous utilisez L'AlertDialog de la bibliothèque de soutien.
Si c'est le cas, essayez de remplacer votre import android.App.AlertDialog.
Utiliserandroid.support.v7.app.AlertDialog
qui alignera vos boutons positif et négatif au centre.
android.app.AlertDialog
placera le bouton dans le haut en laissant un espace de 16dp dans le bas.
vous pouvez régler les boutons positif, négatif et neutre, Cacher les boutons positif et neutre, et mettre le bouton négatif où le bouton neutre est censé être(centre) en utilisant 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());