2012-06-21 16 views
6

Powiedzmy, że mamy dwie aktywności: Activity1 i Activity2.android - Jak wyświetlić okno dialogowe po zakończeniu aktywności

W Activity1 za onClick() metoda, mamy połączenie rozpocząć działalność 2 czy dany przycisk jest wciśnięty:

Intent myIntent = new Intent(Activity1.this, Activity2.class); 
Activity1.this.startActivity(myIntent); 

Po zakończeniu() jest wywoływana w Activity2 i Activity1 zostanie wznowione, Potrzebuję okno dialogowe do wyświetlenia w Activity1, jak tylko zostanie wznowione.

Przed, po prostu nazywa ShowDialog (id) w tym samym bloku Activity1 za onClick() metoda:

public void onClick(View v) { 
    if(v == addHole){ 
    //... 
    Intent myIntent = new Intent(Activity1.this, Activity2.class); 
    Activity1.this.startActivity(myIntent); 
    showDialog(END_DIALOG_ID); 
    } 
} 

Problem jest, po wznowieniu Activity1, okno odpowiadające END_DIALOG_ID nie jest widoczny, ale ekran jest przyciemniony i nie reaguje (tak jakby dialog był obecny), dopóki nie zostanie naciśnięty klawisz wstecz.

Próbowałem umieścić wywołanie showDialog() w metodach onResume() i onRestart() Activity1, ale oba te programy powodują awarię programu.

Próbowałem również utworzyć metodę AsyncTask w Activity2, z wywołania showDialog() w jego onPostExecute(), ale okno dialogowe nie jest widoczne w Activity2.

private class ShowDialogTask extends AsyncTask<Void, Void, Integer> { 
    /** The system calls this to perform work in a worker thread and 
    * delivers it the parameters given to AsyncTask.execute() */ 
    protected Integer doInBackground(Void... id) { 
     //do nothing 
     return END_DIALOG_ID; 
    } 

    /** The system calls this to perform work in the UI thread and delivers 
    * the result from doInBackground() */ 
    protected void onPostExecute(Integer id) { 
     super.onPostExecute(id); 
     showDialog(id); 

    } 
} 

Jestem teraz próbuje wdrożyć to poprzez wywołanie

Activity1.this.startActivityForResult(myIntent, END_DIALOG_REQUEST); 

z analogicznym setResult() i onActivityResult() metod z Activity1, ale wydaje się, że nie powinno być lepsze praktyki dla realizacji tego. Wszystko, czego potrzebuję, to pokazanie okna dialogowego po zakończeniu działania2.

Dziękujemy za pomoc.

+1

Chciałem zasugerować startActivityForResult i onActivityResult, ale wydaje się, że odkryłeś to na własną rękę. Dla mnie to najprostszy sposób na osiągnięcie tego, co chcesz. – mportuesisf

Odpowiedz

7

Tak jak sugerujesz, zadzwoń pod numer startActivityForResult, rozpoczynając Activity2. Następnie zastąp nadpisanie onActivityResult i sprawdź, czy jest w nim RESULT_OK, a następnie wyświetl okno dialogowe. Jest to całkowicie akceptowalna praktyka do robienia tego, co chcesz zrobić.

+0

Dzięki. Wydaje się, że jest to najlepsza odpowiedź, ponieważ przesłonięcie 'onResume()' powoduje wyświetlenie okna dialogowego przy pierwszym uruchomieniu Activity1, a 'onRestart()' powoduje wyświetlenie okna dialogowego, jeśli aplikacja straci fokus. Używanie 'startActivityForResult' wydaje się być lepszym pokazaniem tylko okna dialogowego, gdy kończy się działanie2 (lub jest anulowane za pomocą klawisza WSTECZ). Dzięki jeszcze raz! – avoyles

+0

Nie ma za co. Jeszcze jedną rzeczą, o której należy pamiętać, jest to, że 'onResume()' zostanie wywołany, jeśli użytkownik przejdzie do innej aplikacji (telefon, wiadomości, cokolwiek), a następnie z powrotem do swojej aktywności. – wsanville

+0

Hmm, tak. Trafne spostrzeżenie.Ale myślę, że "startActivityForResult" będzie działał lepiej, ponieważ chcę tylko, aby okno dialogowe było wyświetlane po zakończeniu działania Activity2 i skupieniu się na Activity1. Okno dialogowe służy do uzyskania znacznika czasu i musi być w momencie przejścia działania2 z powrotem w działanie1. – avoyles

0

Można użyć onResume metody (jeśli nic z activity2 nie u'r patrząc)

@Override 
public void onResume(){ 
    super.onResume(); 
    //do something 
} 
+0

Użycie funkcji showDialog() w onResume() powoduje również wyświetlenie okna dialogowego po utworzeniu składnika Activity1. – avoyles

+0

Jednak użycie onRestart zamiast onResume wydaje się działać zgodnie z potrzebami. Zapomniałem nazwać 'super.onRestart()', gdy próbowałem tego wcześniej. W jakich przypadkach mogę się martwić, że funkcja onRestart() zostanie wywołana inaczej niż po zakończeniu czynności 2? – avoyles

+0

Musisz upewnić się, że każda zmienna używana w 'onRestart()' została już zainicjowana/ponownie zainicjowana lub spowoduje rzutowanie 'NullPointerException' – Hein

0

muszę powrócić do aktywności korzeni - główną działalność, potencjalnie zamykając kilka czynności, a następnie wyświetlić okno. Więc wybrałem alternatywny sposób.

MyDialog { 
    public static synchronized void planToShowDialog(String info) { 
     if (info != null) { 
      saveInfoToPreferences(info); 
     } 
    } 

    public static synchronized void showDialogIfNecessary(Context context) { 
     String info = readInfoFromPreferences(); 
     if (info != null) { 
      saveInfoToPreferences(null); // Show dialog once for given info. 
      new MyDialog(context, info).show(); 
     } 
    } 

    private static String readInfoFromPreferences() { 
     //... 
    } 

    private static void saveInfoToPreferences(String info) { 
     //... 
    } 
} 

zgłoszę MyDialog.showDialogIfNecessary() z MainActivity.onPostResume sposób().

Powiązane problemy