Question Comment créer un écran de démarrage?


Je voulais rendre mon application plus professionnelle, j'ai donc décidé de créer un écran d'accueil.

Comment pourrais-je le créer et l'implémenter ensuite?


423
2018-03-30 13:15


origine


Réponses:


En lire plus:

Vieille réponse:

COMMENT: Écran de démarrage simple

Cette réponse vous montre comment afficher un écran de démarrage pendant une durée déterminée au démarrage de votre application, par ex. raisons de marque. Par exemple. vous pouvez choisir d'afficher l'écran de démarrage pendant 3 secondes. Toutefois, si vous souhaitez afficher l'écran de démarrage pendant une période de temps variable (par exemple, le temps de démarrage de l'application), consultez la réponse d'Abdullah. https://stackoverflow.com/a/15832037/401025. Cependant, sachez que le démarrage de l'application peut être très rapide sur les nouveaux appareils, de sorte que l'utilisateur verra juste un flash qui est mauvais UX.

Vous devez d’abord définir l’écran de spash dans votre 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 ;)


425
2018-03-30 13:28



Notez que cette solution ne laissera pas l'utilisateur attendre plus: le délai de l'écran de démarrage dépend de l'heure de démarrage de l'application.

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

Tout d'abord, créez un style.xml dans le dossier de 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>

À la place d'utiliser @android:style/Theme.DeviceDefault.Light.NoActionBar vous pouvez utiliser n'importe quel autre thème en tant que parent.

Deuxièmement, dans votre application Manifest.xml ajouter 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);
}

METTRE À JOUR Découvrez ce post https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd Merci à @ mat1h et @adelriosantiago


474
2018-04-05 10:53



  • Créer une activité: Splash
  • Créer un fichier XML de présentation: splash.xml
  • Placez les composants de l'interface utilisateur dans la mise en page splash.xml pour qu'elle ressemble
  • 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 voulez démarrer après l'écran de démarrage

  • 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>

47
2018-03-30 13:21



La réponse de @Abdullah est correcte, mais Google a publié une explication détaillée sur la manière de l'implémenter correctement sans modifier le thème de votre activité:

https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd

Des applications comme Google Maps et YouTube ont commencé à utiliser la même méthode.


30
2017-07-23 08:21



Les réponses ci-dessus sont très bonnes, mais j'aimerais ajouter autre chose. Je suis nouveau sur Android, j'ai rencontré ces problèmes lors de mon développement. J'espère que cela peut aider quelqu'un comme moi.

  1. L'écran Splash est le point d'entrée de mon application, ajoutez donc les lignes suivantes dans AndroidManifest.xml.

        <activity
            android:name=".SplashActivity"
            android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
  2. L'écran de démarrage ne devrait apparaître qu'une seule fois dans le cycle de vie de l'application, j'utilise une variable booléenne pour enregistrer l'état de l'écran de démarrage, et ne l'affiche que la première fois.

    public class SplashActivity extends Activity {
        private static boolean splashLoaded = false;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (!splashLoaded) {
                setContentView(R.layout.activity_splash);
                int secondsDelayed = 1;
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        startActivity(new Intent(SplashActivity.this, MainActivity.class));
                        finish();
                    }
                }, secondsDelayed * 500);
    
                splashLoaded = true;
            }
            else {
                Intent goToMainActivity = new Intent(SplashActivity.this, MainActivity.class);
                goToMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(goToMainActivity);
                finish();
            }
        }
    }
    

codage heureux!


27
2017-12-22 08:30



  1. Créé 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 ça

    <?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> 
    

13
2018-03-28 06:16



Un Splash Screnn, par défaut, ne rend pas automatiquement votre application plus professionnelle. Un écran Splash conçu par des professionnels a la possibilité de rendre votre application plus professionnelle, mais si vous ne savez pas comment l'écrire, alors le reste de votre application sera professionnel.

A propos de la seule raison (excuse) pour avoir un écran Splash est parce que vous faites un grand nombre de calculs ou sont en attente de démarrage GPS / WiFi parce que votre application repose sur cela avant de commencer. Sans le résultat de ces calculs ou l'accès au GPS / WiFi (etc.) votre application est morte dans l'eau, donc vous sentez que vous avez besoin d'un écran de démarrage, et doit bloquer la vue de l'écran pour tous les autres programmes en cours ).

Un tel écran de démarrage devrait ressembler à votre application plein écran pour donner l'impression qu'il a déjà été initialisé, puis après les longs calculs sont terminés les détails finaux pourraient être remplis (l'image modifiée). le chance de ce fait ou que c'est la seule façon de concevoir le programme est puissant petit.

Il vaudrait mieux permettre à l'utilisateur (et au reste du système d'exploitation) de faire autre chose pendant qu'ils attendent plutôt que de concevoir votre programme pour dépendre de quelque chose qui prendra du 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 commence. Le temps ou l'espace occupé par l'écran de démarrage peut être utilisé pour charger des pré-calculs ou effectuer les 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 GPS / WiFi, il serait préférable de laisser l'application démarrer et d'avoir une fenêtre contextuelle indiquant qu'il est nécessaire d'attendre les calculs (un message TEXTUAL "Initializing" est correct). L'attente du GPS / WiFi est attendue (si elles n'étaient pas déjà activées dans un autre programme), il est donc inutile d'annoncer leurs temps d'attente.

Rappelez-vous que lorsque l'écran de démarrage démarre votre programme est déjà en cours d'exécution, tout ce que vous faites est de retarder l'utilisation de votre programme et accaparer le CPU / GPU pour faire quelque chose que la plupart ne sentent pas nécessaire.

Nous ferions mieux d’attendre et de voir votre écran de démarrage chaque fois que nous lancerons votre programme ou nous n’aurons pas l’impression que ce sera écrit de manière très professionnelle. Rendre l'écran Splash FULL Screen et une copie de l'écran du programme (donc nous pensons qu'il est initialisé alors qu'il ne l'est pas) POURRAIT atteindre votre objectif (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 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, les moyens de le faire sont indiqués ci-dessus. Assurez-vous que cela rend votre application plus professionnelle ou que vous avez vaincu la seule raison que vous avez donnée pour cela.

C'est comme une chaîne YouTube qui démarre chaque vidéo avec une longue introduction graphique (et Outro) ou ressent le besoin de raconter une blague ou d'expliquer ce qui s'est passé la semaine dernière (quand il ne s'agit pas d'une chaîne Comedy ou LifeStyles). Juste montrer le spectacle! (Il suffit de lancer le programme).


12
2018-05-21 01:03



Surtout, les réponses sont vraiment très bonnes. Mais il existe des problèmes de fuite de mémoire. Ce problème est souvent connu dans la communauté Android comme "Fuite d'activité". Maintenant, qu'est-ce que cela signifie exactement?

Lorsqu'un changement de configuration se produit, par exemple un changement d'orientation, Android détruit l'activité et la recrée. Normalement, le ramasse-miettes efface simplement la mémoire allouée de l'ancienne instance Activity et nous sommes tous bons.

"Fuite d'activité" fait référence à la situation où le récupérateur de place ne peut pas effacer la mémoire allouée de l'ancienne instance d'activité being (strong) referenced à partir d'un objet qui a vécu l'instance d'activité. Chaque application Android dispose d'une quantité de mémoire spécifique. Lorsque Garbage Collector ne peut pas libérer de mémoire inutilisée, les performances de l'application diminuent progressivement et finissent par OutOfMemory Erreur.

Comment déterminer si l'application perd de la mémoire ou non? Le moyen le plus rapide consiste à ouvrir l'onglet Mémoire dans Android Studio et à faire attention à la mémoire allouée lorsque vous modifiez l'orientation. Si la mémoire allouée continue à augmenter et ne diminue jamais, vous avez une fuite de mémoire.

1. fuite de mémoire lorsque l'utilisateur modifie l'orientation. enter image description here

Vous devez d'abord définir l'écran de démarrage dans votre ressource de mise en page. splashscreen.xml fichier

Exemple de code pour l'activité de l'écran de démarrage.

public class Splash extends Activity {
 // 1. Create a static nested class that extends Runnable to start the main Activity
    private static class StartMainActivityRunnable implements Runnable {
        // 2. Make sure we keep the source Activity as a WeakReference (more on that later)
        private WeakReference mActivity;

        private StartMainActivityRunnable(Activity activity) {
         mActivity = new WeakReference(activity);
        }

        @Override
        public void run() {
         // 3. Check that the reference is valid and execute the code
            if (mActivity.get() != null) {
             Activity activity = mActivity.get();
             Intent mainIntent = new Intent(activity, MainActivity.class);
             activity.startActivity(mainIntent);
             activity.finish();
            }
        }
    }

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

    // 4. Declare the Handler as a member variable
    private Handler mHandler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        // 5. Pass a new instance of StartMainActivityRunnable with reference to 'this'.
        mHandler.postDelayed(new StartMainActivityRunnable(this), SPLASH_DISPLAY_LENGTH);
    }

    // 6. Override onDestroy()
    @Override
    public void onDestroy() {
     // 7. Remove any delayed Runnable(s) and prevent them from executing.
     mHandler.removeCallbacksAndMessages(null);

     // 8. Eagerly clear mHandler allocated memory
     mHandler = null;
    }
}

Pour plus d'informations, veuillez passer par cette lien


11
2018-02-18 01:55



La réponse d'Abdullah est géniale. Mais je veux ajouter plus de détails avec ma réponse.

Implémentation d'un écran de démarrage

Implémenter un écran de démarrage de la bonne manière est un peu différent de ce que vous pourriez imaginer. La vue de démarrage que vous voyez doit être prête immédiatement avant même de pouvoir gonfler un fichier de mise en page dans votre activité de démarrage.

Donc, vous n'utiliserez pas un fichier de mise en page. Au lieu de cela, spécifiez l'arrière-plan de votre écran de démarrage comme arrière-plan du thème de l'activité. Pour ce faire, créez d'abord un fichier XML dessinable dans res / drawable.

background_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@color/gray"/>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

C'est juste une liste de calques avec logo en couleur de fond au centre avec elle.

Ouvrez maintenant styles.xml et ajoutez ce style

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
</style>

Ce thème devra agirbar et avec le fond que nous venons de créer ci-dessus.

Et dans le manifeste, vous devez définir SplashTheme sur l'activité que vous voulez utiliser comme splash.

<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Ensuite, à l’intérieur de votre code d’activité, dirigez l’utilisateur vers l’écran spécifique après l’éclaboussure en utilisant l’intention.

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

C'est la bonne façon de faire. J'ai utilisé ces références pour répondre.

  1. https://material.google.com/patterns/launch-screens.html
  2. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ Merci à ces gars de me pousser dans la bonne direction. Je veux aider les autres parce que la réponse acceptée n'est pas un écran de démarrage recommandé.

9
2017-08-06 03:55