web-dev-qa-db-fra.com

Android Écran de démarrage

Je développe une application qui télécharge beaucoup de données au début de l'application elle-même et les affiche dans ListActivity. Ce que je prévois de faire est d’afficher un écran de démarrage jusqu’à ce que les données soient chargées.

Jusqu'à présent, toutes mes tentatives ont été vaines. J'ai essayé les méthodes mentionnées par anddev.org, mais mon problème est que l'activité principale doit commencer, mais l'écran de démarrage doit être visible jusqu'à ce que je remplisse mon ListActivity. Donc, en bref, je dois passer par les étapes suivantes:

  1. Commencer mon activité principale.
  2. Afficher l'écran de démarrage.
  3. Continuez à exécuter le processus en arrière-plan.
  4. Quittez l'écran de démarrage lorsque le traitement est terminé et affichez la liste principale.

J'espère que vous comprenez à quoi ça ressemble ....

80
JaVadid

Le problème est probablement que vous exécutez l'écran de démarrage (une sorte de dialogue tel que ProgressDialog je suppose) dans le même fil que tout le travail effectué. Cela empêchera la mise à jour de l'affichage de l'écran de démarrage, ce qui l'empêchera même de s'afficher à l'écran. Vous devez afficher l'écran de démarrage, lancer une instance de AsyncTask pour télécharger toutes vos données, puis masquer l'écran de démarrage une fois la tâche terminée.

Ainsi, la méthode onCreate () de votre activité créerait simplement un ProgressDialog et l'afficherait. Créez ensuite la AsyncTask et démarrez-la. Je ferais de l'AsyncTask une classe interne de votre activité principale, afin qu'il puisse stocker les données téléchargées dans une variable de votre activité et fermer le ProgressDialog dans sa méthode onPostExecute ().

Vous ne savez pas comment élaborer plus sans simplement montrer le code, alors le voici:

public class MyActivity extends Activity {
    private ProgressDialog pd = null;
    private Object data = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false);

        // Start a new thread that will download all the data
        new DownloadTask().execute("Any parameters my download task needs here");
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {
         protected Object doInBackground(String... args) {
             Log.i("MyApp", "Background thread starting");

             // This is where you would do all the work of downloading your data

             return "replace this with your data object";
         }

         protected void onPostExecute(Object result) {
             // Pass the result data back to the main activity
             MyActivity.this.data = result;

             if (MyActivity.this.pd != null) {
                 MyActivity.this.pd.dismiss();
             }
         }
    }    
}

Évidemment, il y a quelques éléments à remplir, mais ce code devrait fonctionner et vous donner un bon point de départ (excusez-moi s'il y a une erreur de code, je n'ai pas accès au SDK Android car je suis en train de taper ceci actuellement).

On trouvera encore de la bonne lecture sur le sujet des tâches asynchrones dans Android ici et ici .

89
Mark B

juste pour référence c'est la meilleure façon que j'ai trouvée de créer un écran de démarrage: http://Android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

Je cherchais cela depuis un certain temps, dans androids docs .. si vous voulez éviter ces écrans noirs, vous devez créer un thème avec windowBackground afin:

<resources>
    <style name="Theme.Shelves" parent="Android:Theme">
        <item name="Android:windowBackground">@drawable/background_shelf</item>
        <item name="Android:windowNoTitle">true</item>
    </style>
</resources>

Et définissez ce thème comme thème de votre activité principale ... TADA, écran d'accueil de la première seconde.

Si vous souhaitez un fond complexe et pas seulement une image qui sera étirée à remplir, vous pouvez utiliser Drawables, voici un exemple de liste de calques qui maintiendra le logo centré sur un fond noir:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <item Android:drawable="@color/black">
    </item>
    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@drawable/logo"
            Android:tileMode="disabled" >
        </bitmap>
    </item>
</layer-list>
59
Raanan

Exemple d'écran de démarrage:

public class MainActivity extends Activity {
    private ImageView splashImageView;
    boolean splashloading = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        splashImageView = new ImageView(this);
        splashImageView.setScaleType(ScaleType.FIT_XY);
        splashImageView.setImageResource(R.drawable.ic_launcher);
        setContentView(splashImageView);
        splashloading = true;
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_main);
            }

        }, 3000);

    }

}
1
kablu
  1. Commencer mon activité principale.
  2. Afficher l'écran de démarrage.
  3. Continuez à exécuter le processus en arrière-plan.
  4. Quittez l'écran de démarrage lorsque le traitement est terminé et affichez la liste principale.

J'ai essayé de cette façon, mais le problème est; il montrera l'activité principale avant de commencer l'activité d'écran de démarrage.

Je l'ai fait de cette façon:

  1. Démarrer l'écran de démarrage
  2. Lorsque le processus est terminé, démarrez "l'activité principale"
  3. N'oubliez pas de manipuler le bouton de retour, il devrait donc se fermer. L'application sera appuyée dans l'activité principale. Sinon reviendra à l'écran de démarrage (boucle)

Mon problème est de savoir comment désactiver "afficher le menu de l'activité de l'écran Splash" en appuyant sur le bouton menu.

Edit:

Désactiver le menu du spectacle:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // getMenuInflater().inflate(R.menu.activity_main, menu);
    return false;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {       
    // return super.onMenuItemSelected(featureId, item);
    return false;
}
1
Gabe