2010-02-22 7 views
7

Tworzę dialog następująco:Zidentyfikuj który onClick AlertDialog wyzwalane (okno DialogInterface, int które)

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DIALOG_1: 
    return new AlertDialog.Builder(this) 
    .setTitle(R.string.s_dlg1) 
    .setPositiveButton(android.R.string.ok, this) 
    .create(); 

    case DIALOG_2: 
    ... 
    ... 
    } 

    return null; 
} 

@Override 
public void onClick(DialogInterface dialog, int whichButton) { 
    if (dialog == ???) { 
    ... 
    } 
    else if (dialog == ???){ 
    ... 
    } 
} 

Jak mogę określić, które dialogowe wywoływane metody onClick? Nie mogę zadeklarować metod interfejsu jako w linii podczas tworzenia okna dialogowego, ponieważ chcę uzyskać dostęp do zmiennych w mojej klasie. Każdy inny interfejs przekazuje pewien rodzaj identyfikatora do swoich metod, aby zidentyfikować obiekt zwany metodą, ale nie mogę nic zrobić w oknie dialogowym DialogInterface.

+1

Nie mogę uwierzyć, że nie ma lepszego rozwiązania. Wracam tutaj, jeśli coś mi się podoba ... – AudioDroid

Odpowiedz

1

Być może można wyodrębnić odbiornik onclick jako oddzielną klasę, a następnie przekazać identyfikator okna dialogowego? Interfejs jest android.content.DialogInterface.OnClickListener

+0

To byłoby równoznaczne z przechowywaniem go w prywatnej zmiennej w bieżącej klasie, ponieważ tylko jedno okno dialogowe może być pokazane na raz, a onClick zostanie uruchomiony, zanim użytkownik będzie mógł zrób cokolwiek, aby rozpocząć kolejne okno dialogowe i zmienić wartość. Właśnie to robię teraz, ale to nieczyste. Mam ten sam problem z wieloma DatePickerDialog na tym samym działaniu. Wydaje się, że nie ma prostego sposobu na określenie, który z nich wystrzelił zdarzenie onDateSet. – Monstieur

+0

Nie znam lepszego sposobu, jeśli chcesz zidentyfikować okno, w którym musisz przechowywać id gdzieś, teraz dialogi nie zawierają "tagu" lub id, więc musisz albo zaimplementować onclick w klasie, która otrzymuje zmienna identyfikująca okno dialogowe albo rozszerz klasę okna dialogowego i dodaj identyfikator, albo zapisz w zmiennej w fragmencie wywołującym lub aktywności i pobierz je za pomocą getContext. Innym sposobem (nie wiem, czy to działa) jest użycie okna dialogowegoFragment i dodanie do niego znacznika, dzięki czemu można uzyskać znacznik i zidentyfikować używane okno dialogowe. –

0

to pracuje dla mnie

case Dialog_import_database: 
      return new AlertDialog.Builder(Main.this) 
      .setTitle(R.string.ImportDatabaseDialogTitle) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        // TODO Auto-generated method stub 
        Log.i("Main","positive Button In dialog Box"); 

z powodu tego, co kiedykolwiek chcesz pozytywny skutek, gdy kliknięciu przycisku tutaj

   } 
      }) 
      .setNegativeButton("Cancel", null) 
      .setMessage(R.string.ImportDatabaseMessage) 
      .create(); 
     } 
+0

Nie możesz uzyskać dostępu do zmiennych klas, jeśli zadeklarujesz to w ten sposób. – Monstieur

+0

ten kod jest umieszczany w metodzie ondialogcreate za pomocą instrukcji switch, a następnie wywołuje się showdialog (Dialog_import_database); –

+0

@Kurian Czy na pewno? Czy próbowałeś? :) –

0

trudno zidentyfikować dwa bezpośrednio które okno dialogowe zostało wyświetlone zamiast tego, który przycisk został naciśnięty, więc jeśli zapełnisz okna dialogowe różnymi przyciskami, możesz zrobić lewę. Coś takiego:

new AlertDialog.Builder(this) 
.setTitle(R.string.s_dlg1) 
.setPositiveButton(android.R.string.ok, this) 
.create(); 

new AlertDialog.Builder(this) 
.setTitle(R.string.s_dlg2) 
.setNegativeButton(android.R.string.ok, this) 
.create(); 

@Override 
public void onClick(DialogInterface dialog, int whichButton) { 
if (whichbutton == DialogInterface.BUTTON_POSITIVE) { 
... 
} 
else if (whichButton == DialogInterface.BUTTON_NEGATIVE){ 
... 
} 
Powiązane problemy