80 votes

Écran d'accueil Android

Je suis en train de développer une application qui télécharge un grand nombre de données au début de l'application elle-même et les affiche dans la ListActivity. Ce que je prévois de faire est d'afficher un écran d'accueil 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 démarrer mais que l'écran d'accueil doit rester visible jusqu'à ce que je remplisse ma ListActivity. Donc, en bref, je dois passer par les étapes suivantes :

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

J'espère que vous comprenez ce que c'est....

0 votes

Quelqu'un peut-il m'expliquer pourquoi une barre de progression ne se charge pas, même si j'essaie de la créer et de la lancer dans la fonction OnCreate de ma liste principale... et de la supprimer une fois mon processus terminé... même cela ne fonctionne pas... Je veux dire qu'il y a une méthodologie par défaut que je dois suivre... comme lancer la barre de progression dans OnStart() ou autre ?

0 votes

Avez-vous essayé ce que la réponse acceptée dans stackoverflow.com/questions/2222890/ dit ? EDIT : Ok, la réponse acceptée est un peu la même

89voto

mbaird Points 31293

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

Ainsi, la méthode onCreate() de votre activité créera simplement un ProgressDialog et l'affichera. Ensuite, il faut créer l'AsyncTask et la lancer. Je ferais de l'AsyncTask une classe interne de votre activité principale, afin qu'elle puisse stocker les données qu'elle a téléchargées dans une variable de votre activité et fermer le ProgressDialog dans sa méthode onPostExecute().

Je ne sais pas comment élaborer davantage sans 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();
             }
         }
    }    
}

Bien sûr, il y a quelques éléments à compléter, mais ce code devrait fonctionner et vous donner un bon point de départ (pardonnez-moi s'il y a une erreur de code, je n'ai pas accès au SDK Android au moment où je tape ces lignes).

Vous trouverez d'autres bonnes lectures sur le sujet des AsyncTasks dans Android. aquí y aquí .

0 votes

Que voulez-vous dire par "remplacer par un objet de données" ? J'ai mes deux fonctions que je veux charger dans l'asynchronisme comme vous l'avez dit, mais je ne sais pas ce que je suis censé retourner. J'ai essayé de retourner null mais l'application se plante.

0 votes

AsyncTask<String, Void, Object> où Object représente le type de données que vous voulez retourner. Voir la section "Les types génériques d'AsyncTask" ici : developer.Android.com/reference/Android/os/AsyncTask.html

0 votes

C'est vieux, je sais, mais j'ai essayé d'implémenter ceci et la ProgressDialog (dans mon cas, une boîte de dialogue normale qui charge une mise en page) n'est jamais affichée. Je ne le vois que si je commente l'élément .dismiss() dans le onPostExecute . Le premier écran que je vois est toujours le MyActivity thème. Après cela, il va directement à R.layout.main .

61voto

Raanan Points 1928

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

J'ai cherché cela pendant un certain temps, à partir des docs androïdes si vous voulez éviter ces écrans noirs, vous devez créer un thème avec windowBackground ainsi :

<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 le 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 être remplie, vous pouvez utiliser les Drawables, voici un exemple de liste de calques qui gardera le logo centré avec 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 votes

Ce lien est mort, mais le contenu de la page et le code source sont disponibles sur archive.org : web.archive.org/web/20101113015720/http://developer.Android.com/

0 votes

Existe-t-il un moyen d'utiliser un layout.xml au lieu d'un drawable pour Android:windowBackground ? J'obtiens un plantage en essayant de le faire, mais je me demande s'il existe une solution de contournement.

0 votes

@Kevin_TA non, il n'y en a pas. Si vous voulez avoir un logo au milieu de l'écran, vous devez utiliser une liste de calques et utiliser la gravité pour positionner vos images. Je vais mettre à jour la réponse avec un exemple.

1voto

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

J'ai essayé de cette façon, mais le problème est que l'activité principale s'affiche avant l'activité de l'écran d'accueil.

Je l'ai fait comme ça :

  1. Lancer l'écran d'accueil
  2. Lorsque le processus est terminé, commencez l'"activité principale".
  3. N'oubliez pas de gérer le bouton retour, afin qu'il ferme l'application qui sera pressée dans l'activité principale. Sinon, retour à l'écran d'accueil (boucle).

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

Edit :

Désactiver le menu d'affichage :

@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;
}

1voto

kablu Points 6

Exemple d'écran d'accueil :

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

    }

}

0voto

Je sais que cette question est assez ancienne et que le PO n'en a peut-être plus besoin. Mais je veux juste ajouter cette réponse pour aider les personnes qui pourraient en avoir besoin pour archiver un écran d'accueil.

Réponse : (ne fonctionne que sur les versions Android Oreo ou supérieures)


En fait, dans les nouvelles versions d'Android (après Android Oreo), l'écran d'accueil intégré est déjà pris en charge. Cela signifie que vous n'avez pas besoin de créer une activité supplémentaire pour le faire. Vous avez seulement besoin d'un fichier de ressource dessinable pour l'affichage.

Cette méthode est plus rapide pour votre écran d'accueil et permet d'afficher votre contenu juste après l'initialisation. Mais s'il vous plaît noter que cela ne fonctionne que sur Android Oreo ou des versions supérieures. Sur la version précédente, il montrera blanc au lieu de votre écran d'accueil (au moins je le pense).

Vous avez besoin de cette ligne dans le style de votre AppTheme :

<item name="android:windowSplashscreenContent">@drawable/YOUR_SPLASH_SCREEN_DRAWABLE</item>

Il s'agit d'un exemple complet :

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

    <!-- Set your splash screen here, it accept a resource from drawable directory-->
    <item name="android:windowSplashscreenContent" tools:targetApi="o">@drawable/splash_screen</item>
</style>

Référence


Et pour plus d'informations sur cet attribut, voir la référence officielle ici : https://developer.Android.com/reference/Android/R.attr#windowSplashscreenContent

Comme il est dit, il est ajouté dans le niveau 26 de l'API.

Et un court extrait de ce qu'il disait :

Référence à une image à utiliser comme contenu de l'écran d'accueil de la fenêtre. Ce tableau sera placé au-dessus de l'écran d'accueil. windowBackground avec ses limites insérées par les barres du système. Si le dessinable ne doit pas être inséré dans les barres du système, utilisez un thème plein écran.

Notez que même si aucun contenu d'écran d'accueil n'est défini sur le thème, le système peut toujours afficher un écran d'accueil en utilisant les autres attributs du thème, comme l'attribut windowBackground .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X