2012-05-04 1 views
2

Я должен показать диалог в операции переднего плана в результате фоновой операции http.Показать диалог везде, если я не знаю текущий контекст?

Когда диалог должен появиться, он может быть повсюду, контекст может быть изменен, например, я начал новую активность.

Если я использую ApplicationContext, чтобы показать диалоговое окно я получаю:

05-04 17: 32: 32,560: E/AndroidRuntime (3663): android.view.WindowManager $ BadTokenException: Невозможно добавить окно - token null не применяется

так ... Как я могу достичь своей цели?

любые предложения?

+0

Вот аналогичный вопрос: [диалог PopUp Android из фоновой темы] (http://stackoverflow.com/questions/1027149/popup-dialog-android-from-background-thread) – Sam

+0

Вы видели мой ответ? – dreamtale

ответ

-1

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

Существует два способа уведомления об активности переднего плана, о которых я знаю, первый способ - использование трансляции, здесь есть вопрос, связанный с ними Android BroadcastReceiver within Activity. Вы можете запустить трансляцию из своей фоновой операции и зарегистрировать свою деятельность в качестве получателя.

Смотрите здесь http://developer.android.com/reference/android/content/Context.html#sendOrderedBroadcast%28android.content.Intent,%20java.lang.String,%20android.content.BroadcastReceiver,%20android.os.Handler,%20int,%20java.lang.String,%20android.os.Bundle%29 и здесь http://developer.android.com/reference/android/content/BroadcastReceiver.html

Второй способ зарегистрировать слушателя с классом, который выполняет фоновую операцию, например (псевдокод)

@Override 
protected void onResume() { 
    BackgroundOperator.registerListener(this); 
} 

@Override 
protected void onPause() { 
    BackgroundOperator.unregisterListener(this); 
} 

public void onOperationComplete(...) { 
    // TODO: Show your dialog here 
} 

Где ваш слушатель может быть что-то вроде этого (что может быть реализовано вашей деятельностью):

interface BackgroundOperatorListener { 
    void onOperationComplete(...); 
} 

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

+0

проблема в том, что ... как узнать, что является основным видом деятельности? – Noodles

+0

ok, я обновил свой ответ, поэтому действия регистрируются в onResume и onPause, это гарантирует, что только фоновая активность получает обратный вызов из фоновой операции, надеюсь, что это поможет. –

+0

Кстати, если вы делаете веб-запросы, я настоятельно рекомендую посмотреть презентацию Google IO REST от Virgil Dobjanschi http://www.youtube.com/watch?v=xHXn3Kg2IQE он описывает аналогичный метод (в отношении его класса Service Helper) –

2

Всякий раз, когда вы создаете диалоговое окно, вы будете в праве действовать? Почему бы просто не использовать эту деятельность в качестве контекста?

В моем собственном коде я создаю вспомогательный класс, который создает для меня диалог. В этот вспомогательный класс я передаю текущую активность, заголовок и сообщение. Он создает диалог и возвращает объект AlertDialog, которым я могу управлять.

Вы можете попробовать это, но вам все равно нужно знать контекст/действие, в котором вы хотите отобразить свое диалоговое окно.

+0

Нет, я не могу, потому что, пока я жду результата фона (используя обработчик), я могу начать новую деятельность, изменяющую текущий контекст. Обработчик предыдущего действия может отображать диалоговое окно не в действии, в котором обработчик (ваше решение), а в новом. – Noodles

0

Я думаю, что вам нужно получить максимальную активность задачи (текущая активность), а затем использовать ее для отображения диалога.

так видеть эту тему: How to get any identifier of the topmost activity?

Edit: выводя из фона не хороший пользовательский опыт, вы можете отправить уведомление или просто сделать долгое время тоста.

0

На мой взгляд, лучший способ - создать одно новое действие и использовать его как диалог. шаги:

  1. Создание нового вида деятельности, например, (чтобы быть оригинал) MainActivy.

  2. Заполните поле activity_main.xml как можно скорее.

  3. В вашем AndroidManifest.xml перепишите эти строки.

    <activity 
         android:theme="@style/AppTheme.Dialog" 
         android:name="com.myapp.original.example" 
         android:label="@string/timy_titlle" > 
    
  4. Позвоните свое MainActivity, в настоящее время преобразована в диалог, от другой activies с помощью Intent класса.

Если вы используете Action Bar Compact, то можете использовать this others steps.