Question

Je veux montrer un AlertDialog avec une option qui pourrait changer à chaque demande. Ainsi, par exemple à un moment donné, je veux montrer l'option « ajouter aux contacts », tandis qu'un autre temps, il devrait être « supprimer des contacts ».

Mon code ne fonctionne sur la première fois, mais semble Android pour mettre en cache la AlertDialog de sorte que onCreateDialog ne soit pas exécuté la prochaine fois. Par conséquent, l'option ne marche pas plus changer. Puis-je empêcher cette mise en cache, ou est-il juste une autre façon de changer l'option?

Je travaille avec SDK 1.5, mais en utilisant 1.1.

@Override
protected Dialog onCreateDialog(final int id) {
    ...
    String add_remove_contact = res.getString(R.string.profile_add_to_contacts);
    if (user.getContacts().contains(profileID)) {
        add_remove_contact = res.getString(R.string.profile_remove_from_contacts);
        // TODO: this string is not changed when contact status changes 
    }
    final CharSequence[] items = {res.getString(R.string.view_profile),
                                  res.getString(R.string.profile_send_message),
                                  add_remove_contact};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    ...
    return builder.create();
}
Était-ce utile?

La solution

Vous pouvez également utiliser la fonction removeDialog (int) de l'activité. Lorsqu'une boîte de dialogue est rejeté, l'activité enregistre essentiellement l'état de la boîte de dialogue (pour des raisons de performance, j'imagine). Appel removeDialog (int) sur la boîte de dialogue oblige l'activité de décharger toutes les références pour la boîte de dialogue et rejette de l'écran si elle est en cours apparaît.

Création Dialogs

Autres conseils

Je crois avoir une solution pour le comportement incohérent mentionné ci-dessus. Lors de la création d'abord la boîte de dialogue (quand il est encore un AlertDialog.Builder), vous devez définir le message à un état initial (non nul) ou onPrepareDialog ne sera pas le remplacer par la valeur prévue. Ainsi, lorsque vous créez la boîte de dialogue, faire quelque chose comme cela pour toujours avoir une valeur non nulle dans le message. Je me suis battu avec ce pendant plusieurs jours et a trouvé cette solution par hasard:

AlertDialog.Builder resultAlert = new AlertDialog.Builder(context);

if ( message == null ) {
    resultAlert.setMessage("");
} else {
    resultAlert.setMessage(message);
}

Je comprends les raisons de performance pour l'utilisation des boîtes de dialogue gérées d'activité, mais recommande qu'ils ne sont pas utilisés, sauf pour les cas simples. Les raisons sont:

  1. L'argument Bundle n'a été ajouté dans l'API de niveau 8, ne peut donc pas être adopté pour la compatibilité ascendante. Cela signifie en effet que « onPrepareDialog » doit compter sur des variables non locales des différences d'état;

  2. La pratique indique un mauvais comportement et incohérents en réponse à tout changement de dialogue faites dans le corps de « onPrepareDialog ».

Aucune de ces difficultés se posent si Dialogs sont sous-classés et créés au besoin. « SetOwnerActivity » peut être appelé si nécessaire.

Quand vous avez un findViewById (...)

boîte de dialogue personnalisée, vous pouvez modifier des éléments personnalisés à l'aide. Dialog.getWindow ()

Cet exemple enregistrer le dernier texte affiché et l'afficher à nouveau la prochaine fois que vous affichez la fenêtre.

// custom dialog
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.customized);

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialogInterface) {
       EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
       savedText = dialogText.getText();
    }
});

dialog.show();
EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
dialogText.setText(savedText);

xml de dialogue personnalisé:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<Button
    android:id="@+id/buttonOK"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="OK"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="16dp" />

<EditText
    android:id="@+id/customText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="19dp"
    android:hint="Message"
    android:ems="10"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

Je suis une idée, mais pas si bon * Ceci est utilisé lorsque les utilisateurs ne pas utiliser la boîte de dialogue assez fréquemment * La solution:.! D'abord, vous devez déclarer une variable (type int ) et rendre la valeur par défaut comme 0.such que private int i=0; et avant d'utiliser les méthodes showDialog d'activité, augmenter la i variable de type int et afficher la valeur i comme paramètre comme méthode showDialog. le code peut que ce

private int i=0;

//before you show the dialog
this.i++;
this.showDialog(this.i);

exactement. pour AlertDialog, qui a été créé en poids / Builder.create(), onPrepareDialog() est inutile. Builder est une manière qu'une fois la boîte de dialogue est créé, vous ne pouvez pas mettre à jour. je veux dire ne peux pas lâche, je suis sûr que vous pourriez obtenir une poignée à la vue et tout faire manuellement, mais que les défaites le point d'utiliser le constructeur en premier lieu.

la seule solution que j'ai trouvé était de créer manuellement / afficher / fermer la boîte de dialogue au lieu d'utiliser onCreateDialog(), showDialog(), etc. J'ai essayé d'appeler removeDialog(), mais cela ne semble pas fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top