web-dev-qa-db-fra.com

Comment définir l'ordre des boutons positifs et négatifs dans AlertDialog?

Pourquoi est-ce que je veux faire cela est une autre discussion, mais je dois trouver le meilleur moyen de faire en sorte que tous mes dialogues d'alerte aient le bouton positif à droite. Notez que dans la version 3.0 et au-dessous, les boutons apparaissent normalement comme OK/Annuler et dans la version 4.0 et au-dessus, il s'agit de Annuler/OK. Je veux forcer mon application à utiliser Annuler/OK de la manière la plus simple possible. J'ai beaucoup de AlertDialogs dans l'application.

18
Micah Hainline

Malheureusement, je ne crois pas que vous puissiez le faire. Cependant, pour citer la documentation :

Remarque: Vous ne pouvez ajouter qu'un seul type de bouton à AlertDialog. C'est-à-dire que vous ne pouvez pas avoir plus d'un bouton "positif". Cela limite le nombre de boutons possibles à trois: positif, neutre et négatif. Ces noms ne sont techniquement pas pertinents pour la fonctionnalité réelle de vos boutons, mais devraient vous aider à savoir qui fait quoi.

Ainsi, vous pouvez transformer les différents boutons en ce que vous voulez. Ce que vous voyez ici, c’est l’ordre ayant changé (ordre de ceci réponse):

  • Sur les appareils antérieurs à ICS, l'ordre des boutons (de gauche à droite) était POSITIF - NEUTRE - NÉGATIF. 
  • Sur les appareils plus récents utilisant ICS, l'ordre des boutons (de gauche à droite) est maintenant NÉGATIF ​​- NEUTRE - POSITIF.

Vous pouvez essayer de vérifier le Build.VERSION et de l'utiliser pour décider quel bouton correspond à lequel au moment de l'exécution.

16
thegrinner

c'est ma solution. C'est un travail pour moi.

    // Show alertDialog after building
    AlertDialog alertDialog = createAlertDialog(context);
    alertDialog.show();
    // and find positiveButton and negativeButton
    Button positiveButton = (Button) alertDialog.findViewById(Android.R.id.button1);
    Button negativeButton = (Button) alertDialog.findViewById(Android.R.id.button2);
    // then get their parent ViewGroup
    ViewGroup buttonPanelContainer = (ViewGroup) positiveButton.getParent();
    int positiveButtonIndex = buttonPanelContainer.indexOfChild(positiveButton);
    int negativeButtonIndex = buttonPanelContainer.indexOfChild(negativeButton);
    if (positiveButtonIndex < negativeButtonIndex) {
        // prepare exchange their index in ViewGroup
        buttonPanelContainer.removeView(positiveButton);
        buttonPanelContainer.removeView(negativeButton);
        buttonPanelContainer.addView(negativeButton, positiveButtonIndex);
        buttonPanelContainer.addView(positiveButton, negativeButtonIndex);
    }
7
林奕忠

Vous pouvez étendre le AlertDialog.Builder pour forcer la commande:

public class MyDialog extends AlertDialog.Builder {

    public MyDialog(Context arg0) {
        super(arg0);
    }

    @Override
    public Builder setPositiveButton(CharSequence text, OnClickListener listener) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return super.setNegativeButton(text, listener);
        } else {
            return super.setPositiveButton(text, listener);
        }

    }

    @Override
    public Builder setNegativeButton(CharSequence text, OnClickListener listener) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return super.setPositiveButton(text, listener);
        } else {
            return super.setNegativeButton(text, listener);
        }
    }

}
4
CelinHC

J'ai pensé que je pouvais simplement définir le texte du bouton positif sur Annuler et le négatif sur OK, mais il s'avère qu'ils sont dans l'ordre alphabétique.

1
Dave S

J'ai créé une solution pour forcer l'ordre des boutons pour n'importe quelle version Android sur n'importe quel appareil.

L'idée est que nous pouvons obtenir une liste de boutons de dialogue afin qu'ils apparaissent à l'écran et définir le texte et les actions dans l'ordre que nous voulons. Cela garantit que nous aurions le même ordre sur tous les appareils.

S'il vous plaît vérifier mon GitHub référentiel

Voici un exemple de création et d’affichage du dialogue:

 new FixedOrderDialogFragment.Builder()
    .setLeftButtonText(R.string.left)
    .setCenterButtonText(R.string.center)
    .setRightButtonText(R.string.right)
    .setDefaultButton(FixedOrderDialogFragment.BUTTON_RIGHT)
    .setMessage(R.string.message)
    .setTitle(R.string.app_name)
    .create()
 .show(getSupportFragmentManager(), "DEMO");

Veuillez noter que l'activité propriétaire doit implémenter FixedOrderDialogFragment.FixedOrderDialogListener pour pouvoir restaurer l'état de la boîte de dialogue lors de la recréation de l'activité.

1
rude

Parfois, des perspectives complètement différentes sont la solution à un problème, la culture des utilisateurs HI.

  • Sous Win32, un bouton OK et un bouton Annuler sont absolument nécessaires ou la boîte de dialogue ne fonctionnera pas.
  • Sous Android, le HI est assez différent en raison de l'existence du bouton "Précédent" du système d'exploitation (onBackPressed () qui peut également être remplacé, ESC sur les claviers physiques connectés) dans le système d'exploitation HI. 

    • Il n'est pas nécessaire d'utiliser un bouton Annuler/Négatif dans la plupart des cas.
    • Donc, la plupart des dialogues suffisent avec le bouton Positif
    • Alors il n'y a pas de problème d'ordre de bouton , le bouton positif est seul? 
    • Si vous êtes dans un champ d'édition, définissez-le sur edittext.setSingleLine (); et entrez déplacera le focus sur le bouton positif unique. Entrez à nouveau et son bouton positif enfoncé. 
    • Si l'utilisateur souhaite appuyer sur Annuler, il appuie sur le bouton "Précédent" du système d'exploitation (En tant que développeur, nous n'avons pas besoin d'expliquer le noyau de la stratégie du système d'exploitation HI à l'utilisateur. Il s'agit d'un problème de l'émetteur du système d'exploitation. Nous venons de quitter la boîte de dialogue Android sans bouton Annuler.)
0
Jan Bergström
  • Dans AlertDialog buttonPanel, les trois boutons sont classés par [Neutre] [Négatif] [Positif]
  • alors vous pouvez définir des boutons comme les codes suivants

    builder.setNeutralButton ("Negative", auditeur);

    builder.setNegativeButton ("Neutral", auditeur);

    builder.setPositiveButton ("Positif", auditeur);

0
willkernel