2010-07-22 1 views
4

alt text http://img252.imageshack.us/img252/643/snakesonadialog.pngProgressDialog nicher à l'intérieur d'un autre dialogue vide

Salut les gens,

Je suis en train de la touche finale à une application et il y a encore une question en suspens avec l'application dans son ensemble.

J'affiche les indicateurs de chargement sous la forme de ProgressDialogs tout en tirant des données à partir du Web. Pour une raison ou une autre, mes ProgressDialogs semblent imbriqués dans une autre boîte de dialogue vide. Le résultat est collant.

Mon code de mise en page ressemble à ceci:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/Theme.MyTheme.EpisodeList"> 
    <ImageView android:src="@drawable/featured" 
     android:layout_width="fill_parent" 
     android:layout_height="50sp" 
     android:layout_gravity="top" 
     android:shadowRadius="0" 
     android:shadowColor="#FFFFFF" 
     android:id="@+id/header_image" 
    /> 
    <ListView android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</LinearLayout> 

Le code que j'utilise pour afficher le ProgressDialog est la suivante:

// In my class definition 
private ProgressDialog p; 

// in my onCreate method 
p = new ProgressDialog(EpisodeActivity.this, ProgressDialog.STYLE_SPINNER); 
p.setMessage("Loading..."); 
p.show(); 

Des regards s'il, il n'y a rien qui semble mal. Je joins également une photo pour illustrer le problème.

Toute aide est appréciée!

Répondre

2

Après quelques jours de jeu, j'ai trouvé la meilleure façon de gérer ProgressDialogs. Traiter avec ProgressDialogs simple est définitivement trop compliqué sur la plate-forme Android, mais cela ne signifie pas que nous avons une excuse pour ne pas travailler avec eux. Espérons que cela ira mieux (avec la documentation) aller dans le futur. Voici mes meilleures pratiques.

Le problème d'imbrication d'un ProgressDialog dans une boîte de dialogue vide semble être un problème de code pré-2.0 exécuté sur un système 2.1 ou 2.2. Je peux seulement deviner que la méthode show() appelle aussi super.show(), qui se comporte différemment sur 2.1 et 2.2.

Donc, j'ai trouvé que cela fonctionne mieux si vous n'appelez pas show() directement sur les objets ProgressDialog. À la place, utilisez les méthodes intégrées dans showDialog() et onCreateDialog() pour jongler les boîtes de dialogue. Voici un extrait de code:

private static final int ID_DIALOG_LOADING = 0; 

@Override 
protected void onCreate(Bundle tedBundy) { 
    // Do stuff 

    showDialog(ID_DIALOG_LOADING); 

    // Do more stuff in a thread 
} 

@Override 
public void run() { 
    // Do some stuff in this thread 
    handler.sendEmptyMessage(0); 
} 

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     // Let adapters know the data under them have changed 

     try { 
      dimissDialog(ArticlesList.ID_DIALOG_LOADING); 
      removeDialog(ArticlesList.ID_DIALOG_LOADING); 
     } catch (Exception e) {} 
    } 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if (id == ID_DIALOG_LOADING) { 
     ProgressDialog loadingDialog = new ProgressDialog(this); 
     loadingDialog.setMessage("Loading..."); 
     loadingDialog.setIndeterminate(true); 
     loadingDialog.setCancelable(true); 
     return loadingDialog; 
    } 

    return super.onCreateDialog(id); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    try { 
     Log.i("ArticlesList.onSaveInstanceState", "Chirp chirp"); 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
     removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onDestroy() { 
    try { 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
     removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onDestroy(); 
} 

@Override 
protected void onPause() { 
    try { 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
     removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onPause(); 
} 

@Override 
public void onDetachedFromWindow() { 
    try { 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
      removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onDetachedFromWindow(); 
} 

Ceci est un extrait de code long. Vous verrez également des paquets de code dupliqué qui essayent constamment de tuer ce dialogue mort. Ceci est fait parce que Android va détruire puis recréer une vue chaque fois que le téléphone est tourné. Heureusement, dans les versions futures, la fenêtre ne sera pas détruite et rechargée à chaque fois que l'utilisateur fera pivoter l'écran, et implémentera à la place une méthode onScreenRotate(). Après avoir essayé de différentes façons, cette solution hacky semble être la seule chose qui offre des résultats cohérents et rapides de supprimer le ProgressDialog. J'espère que cela sauvera quelques jours du temps de quelqu'un dans le futur.

+0

Je veux montrer les boîtes de dialogue de nidification. Je te prie dis-moi comment faire ceci? –

1

J'ai fixé le même problème en construisant la boîte de dialogue en deux étapes:

ProgressDialog progressDia = new ProgressDialog(this); 
progressDia.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
Questions connexes