2010-12-01 4 views
14

J'essaie d'avoir une boîte de dialogue de progression ouverte lors de l'interrogation de mon serveur. La classe est un ActivityGroup car elle est imbriquée dans une barre d'onglets. Pour conserver la vue dans le cadre, ActivityGroup est nécessaire. Voici la déclaration de ma classe ActivityGroup: Maintenant, ma classe AsyncTaskAndroid: AsyncTask ProgressDialog ne s'ouvre pas dans ActivityGroup

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

est dans le même CheckInActivityClass en tant que tel:

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

Quand je lance l'application donné Throughs une erreur relative à WindowManager $ BadTokenException . En déclarant qu'il ne peut pas démarrer la fenêtre avec un jeton inconnu. J'ai essayé de faire un exemple d'application qui est juste une activité régulière (pas ActivityGroup) et cela a très bien fonctionné.

Est-ce que quelqu'un sait comment modifier cela pour le faire fonctionner, ou un contour qui permettra à la barre de progression d'être imbriquée dans la barre d'onglets? Toute aide est grandement appréciée.

Répondre

22

Si ActivityGroup se trouve dans une TabActivity, vous avez des activités imbriquées avec plus de deux niveaux. Android ne supporte pas cela pour le moment, mais il existe une solution de contournement. Vous devez transmettre l'activité parent au dialogue.

Créer une méthode d'aide à cet effet dans la classe d'activité:

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

Ensuite, changez la ligne

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

à

private final ProgressDialog dialog = new ProgressDialog(getDialogContext()); 
1

Si getParent() ne fonctionne pas pour vous, essayez d'utiliser simplement TabsActivity.context (ou remplacez le nom de la classe d'activité de votre onglet parent). J'utilise des activités imbriquées et, par conséquent, l'utilisation de getParent() ne renvoie toujours pas le bon contexte pour le dialogue, car il nécessite le contexte de l'activité qui étend TabsActivity, pas le parent immédiat.

fix simple:

  1. Vous aurez besoin de créer une variable de contexte dans la classe TabsActivity. Quelque chose comme public static TabsActivity context; et context=this dans la méthode onCreate.

  2. Remplacer cette ligne où vous créez la boîte de dialogue:

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

Avec:

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

et il fonctionne comme un charme.

3

Simple Vous pouvez également utiliser suivant

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

il fonctionne parfaitement pour moi.

Questions connexes