Android: AsyncTask ProgressDialog не открывается в ActivityGroup - PullRequest
14 голосов
/ 02 декабря 2010

Я пытаюсь открыть диалоговое окно прогресса при опросе моего сервера.Класс является 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 (не ActivityGroup), и оно работало просто отлично.

Кто-нибудь знает, как изменить это, чтобы оно работало, или обходной путь, позволяющий вкладывать индикатор выполнения в панель вкладок?Любая помощь с благодарностью.

Ответы [ 3 ]

22 голосов
/ 03 декабря 2010

Если 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());
3 голосов
/ 21 декабря 2012

Простой здесь вы также можете использовать следующие

private final ProgressDialog dialog = new ProgressDialog(getParent());

это отлично работает для меня.

1 голос
/ 09 апреля 2012

Если getParent () не работает для вас, попробуйте использовать просто TabsActivity.context (или подставьте имя класса активности вашей родительской вкладки). Я использую вложенные действия, и в результате использование getParent () все еще не возвращает правильный контекст для диалога, так как ему нужен контекст действия, расширяющий TabsActivity, а не непосредственный родитель.

Простое исправление:

  1. Вам потребуется создать переменную контекста в классе TabsActivity. Что-то вроде public static TabsActivity context; и context=this в методе onCreate.

  2. Замените эту строку, где вы создаете диалоговое окно:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

С:

AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context); 

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

...