Frage

Ich mag eine Alertdialog mit einer Option zeigen, dass bei jeder Anfrage ändern könnte. So zum Beispiel auf einmal möchte ich die Möglichkeit zeigen, „in den Kontakten“, während ein anderes Mal sollte es „von den Kontakten entfernen“ werden.

Mein Code auf dem ersten Mal nicht funktioniert, aber Android scheint die Alertdialog zwischenzuspeichern, so dass onCreateDialog beim nächsten Mal nicht ausgeführt wird. Deshalb tut die Option mehr ändern. Kann ich dieses Caching verhindern, oder ist es nur eine andere Art und Weise die Möglichkeit, zu ändern?

Ich arbeite mit SDK 1.5, aber unter Verwendung von 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();
}
War es hilfreich?

Lösung

Sie können auch die removeDialog (int) in Abhängigkeit von der Aktivität verwenden. Wenn ein Dialog geschlossen wird, speichert die Aktivität im Wesentlichen den Zustand des Dialogs (aus Performance-Gründen würde ich mir vorstellen). Der Aufruf removeDialog (int) auf dem Dialog, um die Aktivität zwingt alle Verweise für den Dialog zu entladen und aus dem Bildschirm entlässt, wenn es. Gezeigt ist wird

Erstellen von Dialogen
Aktivität # removeDialog (int)

Andere Tipps

Hier finden Sie aktuelle onPrepareDialog Methode, die vor dem Dialog aufgerufen wird gezeigt. Dort können Sie die erforderlichen Werte basierend auf Anfrage Typ verändern.

Beispiel mit Datumsauswahl

@Override
protected Dialog onCreateDialog(final int id) {
  switch (id) {
  case DIALOG_DATE_ID:
    final Calendar c = Calendar.getInstance();
    return new DatePickerDialog(this, this, c.get(Calendar.YEAR),
                                c.get(Calendar.MONTH), 
                                c.get(Calendar.DAY_OF_MONTH));
  default:
    return super.onCreateDialog(id);
  }
}

@Override
protected void onPrepareDialog(final int id, final Dialog dialog) {
  switch (id) {
  case DIALOG_DATE_ID:
    //update to current time
    final Calendar c = Calendar.getInstance();
    ((DatePickerDialog) dialog).updateDate(c.get(Calendar.YEAR), 
                                           c.get(Calendar.MONTH), 
                                           c.get(Calendar.DAY_OF_MONTH));
    break;
  }
}

Dies ist ein dup dieser Frage: Android: Kann nicht den Text ändern, erscheint in Alertdialog

Sie können es auch tun, auf diese Weise: http://andmobidev.blogspot.com/2010/ 03 / Modifizieren-Alarm-Dialoge-list-items.html

Scheint die Anzeige des Menüs Longpress zu verlangsamen, obwohl ...

Ich glaube, ich habe ein Update für das inkonsistente Verhalten oben erwähnt. Wenn zunächst den Dialog zu schaffen (wenn es noch ein AlertDialog.Builder), haben Sie die Nachricht in einen Anfangszustand setzen (nicht null) oder onPrepareDialog wird es nicht mit dem vorgesehenen Wert überschreibt. Also, wenn Sie den Dialog erstellen, so etwas tun, immer einen Nicht-Null-Wert in der Nachricht. Ich kämpfte mit diesem für Tage und fand diese Lösung durch Zufall:

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

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

Ich verstehe die Performance-Gründe für die Aktivität verwalten Dialoge verwenden, würde aber empfehlen, dass sie nicht außer für einfache Fälle verwendet werden. Die Gründe hierfür sind:

  1. Das Bundle Argument wurde nur in API-Ebene hinzugefügt 8, so kann nicht für die Abwärtskompatibilität übernommen werden. Dies bedeutet, dass effektiv ‚onPrepareDialog‘ muss auf nicht-lokale Variablen für staatliche Unterschiede verlassen;

  2. Die Praxis zeigt Armen und inkonsistentes Verhalten als Reaktion auf irgendwelchen Dialog im Körper von 'onPrepareDialog' vorgenommenen Änderungen.

Keine dieser Schwierigkeiten entstehen, wenn Dialoge werden subclassed und je nach Bedarf erstellt. ‚SetOwnerActivity‘ kann bei Bedarf aufgerufen werden.

Wenn Sie einen benutzerdefinierten Dialog haben, können Sie benutzerdefinierte Elemente ändern, indem Sie mit dialog.getWindow (). FindViewById (...)

speichert Dieses Beispiel zeigt den letzten Text gezeigt und zeigt sie wieder das nächste Mal, wenn Sie den Dialog zeigen.

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

Customized Dialog des xml:

<?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" />

Und ich eine Idee, aber nicht so gut * Diese wird verwendet, wenn der Benutzer den Dialog nicht sehr häufig verwenden * Die Lösung:.! Zunächst sollten Sie eine Variable (Typ int deklarieren ) und den Standardwert als 0.such als private int i=0; machen und bevor Sie die Showdialog Methoden der Aktivität verwenden, erhöhen Sie die int-Variable i und poste den Wert i als Parameter als Showdialog-Methode. der Code kann dies wie

private int i=0;

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

genau. für Alertdialog, die w / Builder.create() erstellt wurde, ist onPrepareDialog() nutzlos. Builder ist ein Weg, dass, sobald der Dialog erstellt wird, können Sie nicht aktualisieren. Ich meine nicht locker kann, ich bin sicher, dass Sie einen Griff zur Ansicht bekommen konnte und das alles von Hand, aber das besiegt den Punkt des Erbauers in erster Linie verwendet wird.

die einzige Lösung, die ich war gefunden manuell / Show erstellen / entlassen den Dialog statt mit onCreateDialog(), showDialog() usw. i removeDialog() versucht nennen, aber das scheint nicht zu funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top