Android: AsyncTask ProgressDialog не откроется в ActivityGroup
Я пытаюсь открыть диалог прогресса при опросе моего сервера. Класс является ActivityGroup, потому что он вложен в панель вкладок. Чтобы сохранить представление внутри фрейма, необходима группа ActivityGroup. Вот объявление моего класса ActivityGroup:
public class CheckInActivity extends ActivityGroup{
...
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.checkin);
new LocationControl().execute(this);
Теперь мой класс AsyncTask находится в пределах одного CheckInActivityClass как такового:
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
Когда я запускаю данное приложение, он пропускает ошибку, относящуюся к WindowManager $BadTokenException. Заявив, что он не может запустить окно с неизвестным токеном. Я попробовал создать пример приложения, которое является обычным Activity (not ActivityGroup), и оно отлично работает.
Кто-нибудь знает, как изменить это, чтобы заставить его работать, или работа вокруг этого, чтобы индикатор выполнения был вложен в панель вкладок? Любая помощь приветствуется.
Ответы
Ответ 1
Если ActivityGroup находится внутри TabActivity, у вас есть вложенные действия с более чем двумя уровнями. Android не поддерживает это в настоящий момент, но есть обходной путь. Вы должны передать родительскую активность в диалоговом окне.
Создайте вспомогательный метод для этой цели в классе активности:
private Context getDialogContext() {
Context context;
if (getParent() != null) context = getParent();
else context = this;
return context;
}
Затем измените строку
private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);
к
private final ProgressDialog dialog = new ProgressDialog(getDialogContext());
Ответ 2
Простой здесь вы также можете использовать следующие
private final ProgressDialog dialog = new ProgressDialog(getParent());
он отлично работает для меня.
Ответ 3
Если getParent() не работает для вас, попробуйте использовать только TabsActivity.context
(или замените имя класса активности родительских вкладок). Я использую вложенные действия, и в результате использование getParent() по-прежнему не возвращает правильный контекст для диалога, так как ему нужен контекст активности, расширяющий TabsActivity, а не непосредственный родитель.
Простое исправление:
-
Вам нужно создать переменную контекста в классе TabsActivity. Что-то вроде public static TabsActivity context;
и context=this
в методе onCreate.
-
Замените эту строку, в которой вы создаете диалог:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
С
AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context);
и он работает как шарм.