Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: AsyncTask ProgressDialog will not open in ActivityGroup

I am trying to have a a progress dialog open when polling my server. The class is an ActivityGroup because it is nested within a tab bar. To keep the view within the frame, the ActivityGroup is needed. Here is the declaration of my ActivityGroup class:

   public class CheckInActivity extends ActivityGroup{
        ...
        public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.checkin);
            new LocationControl().execute(this);

Now my AsyncTask class is within the same CheckInActivityClass as such:

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

When I run the given app it throughs an error relating to WindowManager$BadTokenException. Stating the it cannot start the window with an unknown token. I tried making a sample app that is just a regular Activity(not ActivityGroup) and it worked just fine.

Does anyone know how to modify this to make it work, or a work around that will allow the progress bar to be nested within the tab bar? Any help is greatly appreciated.

like image 720
mbseid Avatar asked Dec 01 '10 22:12

mbseid


3 Answers

If the ActivityGroup is within a TabActivity you have nested activities with more then two levels. Android doesn't support this at the moment but there is a workaround. You have to pass the parent activity to the dialog.

Create a helper method for this purpose in the activity class:

private Context getDialogContext() {
    Context context;
    if (getParent() != null) context = getParent();
    else context = this;
    return context;
}

Then change the line

private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);

to

private final ProgressDialog dialog = new ProgressDialog(getDialogContext());
like image 197
Tom Avatar answered Nov 04 '22 02:11

Tom


Simple here you can also use following

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

it work perfectly for me .

like image 40
Ronak Mehta Avatar answered Nov 04 '22 02:11

Ronak Mehta


If getParent() doesn't work for you, try using just TabsActivity.context (or substitute the name of your parent tab activity class). I am using nested activities and as a result using getParent() is still not returning the right context for the dialog, since it needs the context of the activity extending TabsActivity, not the immediate parent.

Simple fix:

  1. You'll need to create a context variable in the TabsActivity class. Something like public static TabsActivity context; and context=this in the onCreate method.

  2. Replace this line where you create the dialog:

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

With:

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

and it works like a charm.

like image 1
Kyle Clegg Avatar answered Nov 04 '22 02:11

Kyle Clegg