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); 

и он работает как шарм.