619 votes

Comment faire un écran d'accueil ?

Je veux que mon application ait l'air plus professionnelle, j'ai donc décidé d'ajouter un écran d'accueil.

Comment dois-je procéder à la mise en œuvre ?

64 votes

Pourquoi une application a-t-elle l'air plus professionnelle avec un écran d'accueil ? Je ne connais aucune application Android "professionnelle" qui en possède un.

9 votes

Je suis d'accord avec @theomega. Les écrans splash sont tout simplement ennuyeux.

95 votes

Vous ne devez afficher un écran d'accueil que si vous devez effectuer un travail de chargement en arrière-plan. Sinon, votre application a l'air plus "professionnelle" lorsque vous donnez à l'utilisateur ce qu'il attend de votre application aussi rapidement que possible. Les utilisateurs remarquent (et sont agacés par) des retards de plus de 100 ms, et vous dépassez ce seuil d'un ordre de grandeur en ajoutant un écran d'accueil.

712voto

Abdullah Points 1108

Notez que cette solution ne permettra pas à l'utilisateur d'attendre davantage : le délai de l'écran d'accueil dépend du temps de démarrage de l'application.

Lorsque vous ouvrez une application Android, vous obtenez par défaut un écran noir avec le titre et l'icône de l'application en haut de l'écran. Vous pouvez changer cela en utilisant un style/thème.

Tout d'abord, créez un style.xml dans le dossier Valeurs et ajoutez-y un style.

<style name="splashScreenTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_screen</item>
</style>

Au lieu d'utiliser @android:style/Theme.DeviceDefault.Light.NoActionBar vous pouvez utiliser n'importe quel autre thème comme parent.

Ensuite, dans le Manifest.xml de votre application, ajoutez android:theme="@style/splashScreenTheme" à votre activité principale.

<activity
        android:name="MainActivity"
        android:label="@string/app_name"
        android:theme="@style/splashScreenTheme" >

Troisièmement, mettez à jour votre thème dans votre activité de lancement onCreate().

protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.mainAppTheme);
    super.onCreate(savedInstanceState);
}

UPDATE Vérifiez ce poste .

Merci à @mat1h et @adelriosantiago

0 votes

Est-il correct de supposer que vous avez besoin de screen_shot.png dans chacun des $APP/res/drawable-{l,m,h,xh}dpi/ ?

0 votes

Merci, désolé de vous avoir dérangé avec ça, j'ai compris peu de temps après avoir posté mais j'ai oublié de supprimer.

3 votes

Il semble que le "parent" ne soit supporté qu'à partir de l'API 14.

547voto

artworkad シ Points 15473

Pour en savoir plus :

Vieille réponse :

COMMENT : Écran d'accueil simple

Ce corrigé vous montre comment afficher un écran d'accueil pendant une durée fixe au démarrage de votre application, par exemple pour des raisons d'image de marque. Par exemple, vous pouvez choisir d'afficher l'écran d'accueil pendant 3 secondes. Cependant, si vous souhaitez afficher l'écran d'accueil pendant une durée variable (par exemple, le temps de démarrage de l'application), vous devriez consulter la réponse d'Abdullah. https://stackoverflow.com/a/15832037/401025 . Cependant, il faut savoir que le démarrage de l'application peut être très rapide sur les nouveaux appareils et que l'utilisateur ne verra qu'un flash, ce qui n'est pas bon pour l'ergonomie.

Tout d'abord, vous devez définir l'écran spash dans votre fichier layout.xml fichier

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" android:layout_width="fill_parent"
          android:layout_height="fill_parent">

          <ImageView android:id="@+id/splashscreen" android:layout_width="wrap_content"
                  android:layout_height="fill_parent"
                  android:src="@drawable/splash"
                  android:layout_gravity="center"/>

          <TextView android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="Hello World, splash"/>

  </LinearLayout>

Et votre activité :

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

public class Splash extends Activity {

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        /* New Handler to start the Menu-Activity 
         * and close this Splash-Screen after some seconds.*/
        new Handler().postDelayed(new Runnable(){
            @Override
            public void run() {
                /* Create an Intent that will start the Menu-Activity. */
                Intent mainIntent = new Intent(Splash.this,Menu.class);
                Splash.this.startActivity(mainIntent);
                Splash.this.finish();
            }
        }, SPLASH_DISPLAY_LENGTH);
    }
}

C'est tout ;)

0 votes

Désolé mec... Cela ne fonctionne que sur Android 4.0 et plus. Comment puis-je le faire fonctionner sous Android 2.3.6 ? Merci, je sais que c'est une vieille question mais quelqu'un (comme moi) en aurait besoin. Merci pour votre aide.

0 votes

Désolé mais il se ferme de force voici l'erreur (juste un morceau de celui-ci) FATAL EXCEPTION : main java.lang.NoClassDefFoundError : Android.app.ActivityOptions at com.LCPInt.ittsvolta.List$1.<init>(List.java:31) at com.LCPInt.ittsvolta.List.onCreate(List.java:30)

3 votes

@user2606414 veuillez créer une question sur SO pour votre problème et coller votre journal d'erreurs complet.

62voto

binnyb Points 10492
  • Créer une activité : Splash

  • Créer un fichier XML de mise en page : splash.xml

  • Placez les composants de l'interface utilisateur dans le modèle splash.xml pour qu'il ressemble à ce que vous voulez.

  • votre Splash.java peut ressembler à ceci :

    public class Splash extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
    
            int secondsDelayed = 1;
            new Handler().postDelayed(new Runnable() {
                    public void run() {
                            startActivity(new Intent(Splash.this, ActivityB.class));
                            finish();
                    }
            }, secondsDelayed * 1000);
        }
    }
  • changement ActivityB.class à l'activité que vous souhaitez lancer après l'écran d'accueil.

  • Vérifiez votre fichier manifeste et il devrait ressembler à

        <activity
            android:name=".HomeScreen"
            android:label="@string/app_name">     
        </activity>

        <activity
            android:name=".Splash"
            android:label="@string/title_activity_splash_screen">     
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

32 votes

Ce n'est pas le but de l'écran d'accueil. Cela entraîne un retard supplémentaire d'une seconde. L'écran d'accueil doit être une image pendant le chargement du premier écran de l'application. Ce lien peut vous aider. stackoverflow.com/a/7057332/869451

3 votes

@efeyc : tu as 100% raison pourtant, ça a l'air plutôt joli quand l'application démarre tu ne trouves pas ?

2 votes

@Suda.nese certainement pas. Les utilisateurs ne veulent pas regarder une photo, ils veulent utiliser l'application et ne pas avoir un délai inutile.

13voto

saba Points 224
  1. Créer un Activity SplashScreen.java

    public class SplashScreen extends Activity {
    protected boolean _active = true;
    protected int _splashTime = 3000; // time to display the splash screen in ms
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);
    
        Thread splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    int waited = 0;
                    while (_active && (waited < _splashTime)) {
                        sleep(100);
                        if (_active) {
                            waited += 100;
                        }
                    }
                } catch (Exception e) {
    
                } finally {
    
                    startActivity(new Intent(SplashScreen.this,
                            MainActivity.class));
                    finish();
                }
            };
                 };
        splashTread.start();
    }
     }
  2. splashscreen.xml sera comme ceci

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="600px" android:layout_height="1024px"
      android:background="#FF0000">
    </RelativeLayout>

13voto

Rob Points 94

Un Splash Screnn, par défaut, ne rend pas automatiquement votre application plus professionnelle. Un écran de démarrage conçu de manière professionnelle peut rendre votre application plus professionnelle, mais si vous ne savez pas comment en écrire un, quel sera le niveau de professionnalisme du reste de votre application ?

La seule raison (excuse) d'avoir un écran d'accueil est que vous faites une quantité massive de calculs ou que vous attendez que le GPS/WiFi démarre parce que votre application en dépend avant de démarrer. Sans le résultat de ces calculs ou l'accès au GPS/WiFi (etc.) votre application est morte dans l'eau, donc vous pensez que vous avez besoin d'un écran d'accueil, et que vous DEVEZ bloquer la vue de l'écran pour tous les autres programmes en cours d'exécution (y compris l'arrière-plan).

Un tel écran d'accueil devrait ressembler à votre application en plein écran pour donner l'impression qu'elle a déjà été initialisée, puis, une fois les longs calculs terminés, les derniers détails pourraient être remplis (l'image étant modifiée). Le site chance que ce soit le cas ou que ce soit la seule façon de concevoir le programme. est très petit .

Il serait préférable de permettre à l'utilisateur (et au reste du système d'exploitation) de faire autre chose pendant qu'il attend plutôt que de concevoir votre programme pour qu'il dépende de quelque chose qui prendra un certain temps (lorsque la durée de l'attente est incertaine).

Il y a déjà des icônes sur votre téléphone qui indiquent que le GPS/WiFi démarre. Le temps ou l'espace occupé par l'écran d'accueil pourrait être consacré au chargement des pré-calculs ou à l'exécution des calculs. Voir le premier lien ci-dessous pour les problèmes que vous créez et ce qui doit être considéré.

Si vous devez absolument attendre ces calculs ou le GPS/WiFi, il serait préférable de laisser l'application démarrer et d'afficher une fenêtre indiquant qu'il est nécessaire d'attendre les calculs (un message TEXTUEL "Initialisation" est suffisant). L'attente pour le GPS/WiFi est attendue (s'ils n'ont pas déjà été activés dans un autre programme), il est donc inutile d'annoncer leur temps d'attente.

N'oubliez pas que lorsque l'écran d'accueil s'affiche, votre programme est déjà en cours d'exécution. Tout ce que vous faites, c'est retarder l'utilisation de votre programme et accaparer le CPU/GPU pour faire quelque chose que la plupart des gens ne jugent pas nécessaire.

Il vaut mieux que nous ayons vraiment envie d'attendre et de voir votre écran de démarrage chaque fois que nous lançons votre programme, sinon NOUS n'aurons pas l'impression qu'il est écrit de manière très professionnelle. Faire en sorte que l'écran d'accueil soit un écran complet et une copie de l'écran du programme (afin que nous pensions qu'il est initialisé alors qu'il ne l'est pas) pourrait vous permettre d'atteindre votre objectif (de rendre votre programme plus professionnel) mais je ne parierais pas beaucoup là-dessus.

Pourquoi ne pas le faire : http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/

Comment le faire : https://encrypted.google.com/search?q=Android+splash+screen+source

Il y a donc une bonne raison de ne pas le faire, mais SI vous êtes certain que votre situation ne correspond pas à ces exemples, alors le moyen de le faire est indiqué ci-dessus. Assurez-vous que votre application aura vraiment l'air plus professionnelle ou vous aurez perdu la seule raison pour laquelle vous l'avez fait.

C'est comme une chaîne YouTube qui commence chaque vidéo par une longue introduction graphique (et un Outro) ou qui ressent le besoin de raconter une blague ou d'expliquer ce qui s'est passé la semaine dernière (quand ce n'est pas une chaîne de comédie ou de life style). Montrez simplement l'émission ! (Lancez simplement le programme).

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