Android SplashScreen


79

Je développe une application qui télécharge fondamentalement beaucoup de données au début de l'application elle-même et l'affiche dans le 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é anddev.org mentionné méthodes, mais mon problème est que l'activité principale devrait commencer, mais l'écran de démarrage devrait être visible jusqu'à ce que je remplis 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.

espère que vous comprenez ce qu'il est comme ....

  0

Quelqu'un peut-il expliquer y même une barre de progression ne se charge pas, même si je tente de créer et démarrer dans la fonction OnCreate de ma liste principale ... et le rejeter après que mon processus se termine ... même cela ne fonctionne pas ... je veux dire est-il un ny méthodologie par défaut que je dois suivre ... comme démarrer la barre de progression dans OnStart() ou quelque chose ?? 30 déc.. 092009-12-30 11:11:21

  0

Avez-vous essayé quelle est la réponse acceptée dans http://stackoverflow.com/questions/2222890/how-to-make-a-splash-screen-screen-visible-when-app-starts? EDIT: Ok, la réponse acceptée est un peu la même .. 03 août. 112011-08-03 19:37:06

  0

Check this out http://www.gadgetsaint.com/android/create-video-splash-screen-android/ 21 janv.. 172017-01-21 21:44:45

89

Le problème est plus probable que vous utilisez l'écran de démarrage (une sorte de Dialog tels que ProgressDialog je suppose) dans le même fil que tous les le travail en cours. Cela empêchera la mise à jour de la vue de l'écran de démarrage, ce qui peut l'empêcher de s'afficher à l'écran. Vous devez afficher l'écran de démarrage, lancer une instance de AsyncTask pour aller 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 Activity créerait simplement un ProgressDialog et l'afficherait. Ensuite, créez l'asyncTask et démarrez-le. Je voudrais faire à l'AsyncTask une classe interne de votre activité principale, de sorte qu'il puisse stocker les données qu'il a téléchargées à une certaine variable dans votre activité et ferme le ProgressDialog dans sa méthode onPostExecute().

Je ne sais pas comment élaborer plus sans juste montrer le code, si elle est ici:

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 morceaux que vous devez remplir là-dedans, mais ce code devrait fonctionner et vous donner une bonne point de départ (pardonnez-moi s'il y a une erreur de code, je n'ai pas accès au SDK Android car je tape ceci actuellement).

Certains plus de bonnes lectures sur le sujet de AsyncTasks dans Android peuvent être trouvés here et here.

  0

Que voulez-vous dire par retour "remplacer par des données objet" ? J'ai mes deux fonctions que je veux charger dans l'asynctask comme tu l'as dit mais je ne sais pas ce que je suis supposé y retourner. J'ai essayé de retourner null, mais l'application se bloque. 13 févr.. 122012-02-13 23:26:37

  0

AsyncTask <String, Void, Object> où Object représente le type de données que vous souhaitez renvoyer. Voir la section "Types génériques d'AsyncTask" ici: http://developer.android.com/reference/android/os/AsyncTask.html 14 févr.. 122012-02-14 00:14:33

  0

Ceci est vieux, je sais, mais j'ai essayé d'implémenter ceci et le 'ProgressDialog' (en mon cas un dialogue régulier qui charge une mise en page) n'est jamais montré. Je ne le vois que si je commente le '.dismiss()' dans 'onPostExecute'. Le premier écran que je vois est toujours le thème 'MyActivity'. Après cela, il va directement à 'R.layout.main'. 21 janv.. 142014-01-21 21:33:46

  0

@Kevin_TA si .dismiss() l'empêche de s'afficher, alors votre asyncTask se termine immédiatement. La méthode que j'ai décrite est pour l'affichage d'un écran de démarrage qui s'affiche lors de certaines tâches de démarrage en cours d'exécution. 22 janv.. 142014-01-22 16:39:38

  0

@mbaird ça ne se termine pas immédiatement.J'ai en effet un processus d'arrière-plan qui prend 2-3 secondes à compléter. Cependant, pour une raison quelconque, rien sur l'interface utilisateur n'est mis à jour avant la fin de l'async, ce qui va à l'encontre du but. 22 janv.. 142014-01-22 19:15:29

  0

@Kevin_TA le fait que l'appel .dismiss() le ferme immédiatement, et l'appel .dismiss() qui se passe dans onPostExecute() me dit que vous n'exécutez pas votre processus d'arrière-plan comme AsyncTask. Vous devez vous assurer que la méthode doInBackground() ne renvoie pas tant que votre processus d'arrière-plan n'est pas terminé. 23 janv.. 142014-01-23 16:39:07

  0

est-il un moyen de montrer une image en plein écran (à partir de drawables) au lieu d'une boîte ProgressDialog? 19 juil.. 142014-07-19 09:28:26


58

juste pour référence c'est la meilleure manière que je trouvais pour faire un écran d'accueil: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

Je cherchais cela depuis un certain temps, de androïdes docs .. si vous voulez éviter les écrans noirs, vous devez créer un thème avec windowBackground si:

<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éfinir ce thème comme thème de votre activité principale ... TADA, splashscreen dès la première seconde.

Si vous voulez un arrière-plan complexe et pas seulement une image qui sera étirée pour vous remplir pouvez utiliser dessinables, voici un exemple d'une liste de couche qui gardera 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> 
+1

ce lien est mort, mais le contenu de la page et le code source sont disponibles sur archive.org: http://web.archive.org/web/20101113015720/http://developer.android.com/resources/articles/window- bg-speed.html 27 oct.. 122012-10-27 01:30:49

  0

@Spoonface Merci, j'ai mis à jour le lien. 13 nov.. 122012-11-13 19:01:49

  0

Y at-il un moyen d'utiliser un layout.xml au lieu d'un dessinable pour android: windowBackground? J'ai un accident en essayant de le faire, mais je me demande s'il y a une solution de contournement. 22 janv.. 142014-01-22 19:12:44

  0

@Kevin_TA non, il n'y en a pas. MAIS vous pouvez utiliser les Drawables, donc si vous voulez avoir un Logo au milieu de l'écran, vous devez utiliser une liste de couches et utiliser la gravité pour positionner vos images. Je vais mettre à jour la réponse avec un exemple. 23 janv.. 142014-01-23 14:44:08

  0

@Ranaan Thème solution fonctionne pour moi, mais comment dois-je connecter couche-liste au thème? 08 avril. 142014-04-08 08:13:35

+1

@deko item name = "android: windowBackground" peut être soit une couleur fixe ou une image fixe, soit une liste déroulante de type xml placée dans votre dossier res/drawable. Vous pouvez lire sur Drawables ici: http://developer.android.com/guide/topics/resources/drawable-resource.html 08 avril. 142014-04-08 09:32:28

  0

@Ranaan Je l'ai essayé, mais mon application se bloque au début avec une exception: ligne de fichier XML binaire # 18: <bitmap> nécessite un attribut src valide 08 avril. 142014-04-08 12:24:53

  0

Eh bien, que fournissez-vous dans le bitmap src? Ce devrait être une image disponible. (Vous devriez ouvrir une nouvelle question) 08 avril. 142014-04-08 12:47:20

  0

@Ranaan Vous avez raison, j'ai fait: http://stackoverflow.com/questions/22940232/android-splash-screen-how-to-make-it-centered 08 avril. 142014-04-08 14:34:57

  0

Ceci est le bonne réponse ! bon travail! 31 mars. 152015-03-31 16:39:11

  0

Ceci devrait être la réponse acceptée! De beaucoup de points de vue c'est plus optimal que d'autres solutions. 18 févr.. 162016-02-18 11:13:02

  0

Ouais c'est un vrai splash screen. Merci beaucoup 16 avril. 162016-04-16 17:34:45


1
  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é de l'écran de démarrage.

je l'ai fait de cette façon:

  1. Démarrer l'écran Splash
  2. Lorsque le processus se terminé, démarrez la « activité principale »
  3. Ne pas oublier de gérer le bouton de retour, il devrait fermer l'application est pressée dans l'activité principale. Sinon, retour à l'écran de démarrage (boucle)

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

Edit:

Désactiver menu show:

@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

exemple écran Splash:

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

    } 

}