2012-06-21 2 views
6

Скажем, у нас есть два вида деятельности: Activity1 и Activity2.android - Как показать диалог после завершения операции

В OnClick Activity1 в() метод, у нас есть вызов, чтобы начать активность 2, если определенная кнопка нажата:

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

После завершения() вызывается в деятельности2 и Activity1 возобновляется, мне нужно чтобы показать в Activity1, как только он будет возобновлен.

Раньше я просто назвал ShowDialog (идентификатор) в том же блоке OnClick Activity1 (в) метод:

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

Этот вопрос, после того, как Activity1 резюме, диалог, соответствующий END_DIALOG_ID не видно, но экран затемнен и не реагирует (как будто диалог присутствовал), пока не будет нажата задняя клавиша.

Я попытался поставить вызов showDialog() в методы onResume() и onRestart() Activity1, но оба они врезались в программу.

Я также попытался создать метод AsyncTask в Activity2 с вызовом showDialog() в onPostExecute(), но диалог не отображается в 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); 

    } 
} 

Я сейчас пытаюсь осуществить это путем вызова

Activity1.this.startActivityForResult(myIntent, END_DIALOG_REQUEST); 

с соответствующей setResult() и onActivityResult() методами из Activity1, но мне кажется, что там должна быть лучшей практикой для реализации этого. Все, что мне нужно - это показать диалог, показанный после завершения Activity2.

Спасибо за любую помощь, которую вы можете предоставить.

+1

Я собирался предложить startActivityForResult и onActivityResult, но вы, кажется, обнаружили его самостоятельно. Для меня это самый простой способ добиться того, чего вы хотите. – mportuesisf

ответ

7

Как вы предлагаете, звоните startActivityForResult при запуске Activity2. Затем переопределите onActivityResult и проверьте на RESULT_OK и затем отобразите свое диалоговое окно. Это вполне приемлемая практика для того, чтобы делать то, что вы хотите сделать.

+0

Спасибо. Кажется, это лучший ответ, так как переопределение 'onResume()' заставляет диалоговое окно отображаться при первом запуске Activity1, а 'onRestart()' вызывает отображение диалога, если приложение теряет фокус. Использование 'startActivityForResult', кажется, лучше показывает только диалог, когда Activity2 заканчивается (или отменяется с помощью клавиши BACK). Еще раз спасибо! – avoyles

+0

Добро пожаловать. Еще одна вещь, о которой нужно помнить, заключается в том, что 'onResume()' будет вызываться, если пользователь перейдет в другое приложение (телефон, обмен сообщениями и т. Д.), А затем обратно в вашу активность. – wsanville

+0

Хм, да. Неплохо подмечено.Но я думаю, что 'startActivityForResult' будет работать лучше, поскольку я хочу, чтобы диалоговое окно отображалось только после завершения Activity2, а Activity1 фокусируется. Диалог предназначен для получения метки времени, и он должен быть во время перехода Activity2 обратно в Activity1. – avoyles

0

Вы можете использовать onResume метод (если u'r ничего от деятельности2 не смотрит)

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

Использование showDialog() в onResume() также вызывает отображение диалога при первом создании Activity1. – avoyles

+0

Однако использование функции onRestart вместо функции onResume будет работать по желанию. Я забыл называть 'super.onRestart()' когда я пробовал это раньше. В каких случаях я могу беспокоиться о том, что onRestart() вызывается иначе, чем после завершения Activity2? – avoyles

+0

Вам нужно убедиться, что все переменные, которые будут использоваться в 'onRestart()', уже были инициированы/перезапущены или будут вызывать 'NullPointerException' – Hein

0

Я должен вернуться к корневому деятельности - MainActivity, потенциально закрывая несколько действий, а затем показать диалог. Поэтому я выбрал альтернативный путь.

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) { 
     //... 
    } 
} 

Слово() метод MyDialog.showDialogIfNecessary() из MainActivity.onPostResume.

Смежные вопросы