2010-12-01 19 views
14

Estoy tratando de abrir un cuadro de diálogo de progreso al sondear mi servidor. La clase es un ActivityGroup porque está anidada dentro de una barra de pestañas. Para mantener la vista dentro del marco, se necesita ActivityGroup. Aquí está la declaración de mi clase ActivityGroup:Android: AsyncTask ProgressDialog no se abrirá en ActivityGroup

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

Ahora mi clase AsyncTask está dentro de la misma CheckInActivityClass como tal:

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

Cuando ejecuto la aplicación dado Throughs un error relativo a WindowManager $ BadTokenException . Indicando que no puede iniciar la ventana con un token desconocido. Traté de crear una aplicación de muestra que fuera solo una actividad regular (no ActivityGroup) y funcionó bien.

¿Alguien sabe cómo modificar esto para que funcione, o una solución que permita anidar la barra de progreso dentro de la barra de pestañas? Cualquier ayuda es muy apreciada.

Respuesta

22

Si el ActivityGroup se encuentra dentro de una TabActivity tiene actividades anidadas con más de dos niveles. Android no es compatible con esto en este momento, pero hay una solución. Debe pasar la actividad principal al diálogo.

Crear un método de ayuda para este fin en la clase de actividad:

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

A continuación, cambie la línea

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

a

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

Si getParent() no funciona para ti, intenta usar solo TabsActivity.context (o sustituye el nombre de tu clase de actividad de pestañas principal). Estoy usando actividades anidadas y, como resultado, el uso de getParent() todavía no devuelve el contexto correcto para el diálogo, ya que necesita el contexto de la actividad que extiende TabsActivity, no el elemento primario inmediato.

solución sencilla:

  1. que necesitará para crear una variable de contexto en la clase TabsActivity. Algo así como public static TabsActivity context; y context=this en el método onCreate.

  2. Reemplazar esta línea en la que se crea el cuadro de diálogo:

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

Con:

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

y funciona como un encanto.

3

simple aquí también se puede utilizar después de

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

funciona perfectamente para mí.