Comment réparer l'écran blanc au démarrage de l'application?

111

J'ai une application Android qui affiche un écran blanc pendant 2 secondes au démarrage. Mes autres applications ne le font pas, mais celle-ci le fait. J'ai également implémenté un écran de démarrage dans l'espoir qu'il résoudrait ce problème. Dois-je augmenter la durée de veille de mon écran de démarrage? Merci.

Anonyme
la source
1
L'activité que vous commencez prend trop de temps à faire sa onCreatepart. Essayez de simplement "setContentView" dans cette activité et vérifiez si ce délai a disparu.
Sherif elKhatib
1
désolé, je suis un débutant et je n'ai aucune expérience avec java, pouvez-vous expliquer clairement? et veuillez donner une "réponse" pour que je puisse la cocher :)
Anonyme
1
Utilisez-vous java ou c # dans votre projet?
Sherif elKhatib
1
J'espère que ce lien vous aidera: cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Mikalai Daronin
geeksforandroidgeeks.com/android/splash_issue Veuillez passer par le lien
Vivek Kumar Samele

Réponses:

104

Mentionnez simplement le thème transparent à l'activité de démarrage dans le fichier AndroidManifest.xml.

Comme:

<activity
        android:name="first Activity Name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

et étendre cet écran avec la Activityclasse à la place de AppCompatActivity.

comme :

public class SplashScreenActivity extends Activity{

  ----YOUR CODE GOES HERE----
}
utilisateur543
la source
4
mais en utilisant final ActionBar actionBar = getActionBar();retournera null lorsque le thème est translucide
Someone Somewhere
16
Pankaj - oui, j'ai appris que la mauvaise expérience de l'interface utilisateur était due à la fenêtre "aperçu" ... apparemment, quelqu'un chez Google a décidé qu'une fenêtre d'aperçu blanche était vraiment géniale à utiliser par défaut. Cependant, dans une application qui utilise un fond sombre, c'est une très mauvaise idée. La solution consiste à créer un style personnalisé pour votre application et à spécifier «android: windowBackground» à la couleur que vous souhaitez utiliser. Voir la section "la fenêtre de prévisualisation parfaite" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Someone Somewhere
2
@Hagai L Cela me donne une erreur comme "java.lang.IllegalStateException: Vous devez utiliser un thème Theme.AppCompat (ou un descendant) avec cette activité."
TejaDroid
1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" n'a pas fonctionné pour moi, des suggestions?
jay
1
@TejaDroid pour obtenir l'erreur d'arrêt "java.lang.IllegalStateException", vous devez étendre votre activité par android.app.Activity, vous utilisez actuellement AppCompactActivity. Donc, pour AppCompactActivity, vous ne pouvez pas utiliser de thèmes normaux.
Prêt pour Android le
167

Mettez cela dans un style personnalisé et cela résout tous les problèmes. L'utilisation du correctif translucide hacky rendra votre barre des tâches et votre barre de navigation translucides et fera ressembler l'écran de démarrage ou l'écran principal à des spaghettis.

<item name="android:windowDisablePreview">true</item>

ireq
la source
3
Thx man, sauvé de beaucoup de tracas. J'avais du mal au départ à obtenir le point de réglage. Ce sera le bloc de thème principal: inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` devrait être le point d'entrée du style principal .xml
HumaN
2
THX! Mettez-le dans style.xml dans le dossier res dans style tag name = "AppTheme" (ou quel thème vous utilisez dans le manifeste)
Dimmduh
A travaillé pour moi. Je vous remercie.
user1510006
Je pense que cela devrait être accepté, car beaucoup de développeurs utilisent des thèmes personnalisés
Sviatoslav Zaitsev
super utile :)
jasan
74

entrez la description de l'image ici

Comme votre tube .. initialement, ils affichent un écran d'icône au lieu d'un écran blanc. Et après 2 secondes, l'écran d'accueil s'affiche.

créez d'abord un dessin XML dans res / drawable.

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

Ensuite, vous définissez cela comme arrière-plan de votre activité de démarrage dans le thème. Accédez à votre fichier styles.xml et ajoutez un nouveau thème pour votre activité de démarrage

<resources>

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

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

</resources>

Dans votre nouveau SplashTheme, définissez l'attribut d'arrière-plan de la fenêtre sur votre dessin XML. Configurez ceci en tant que thème de votre activité de démarrage dans votre AndroidManifest.xml:

<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>
</activity>

Ce lien donne ce que vous voulez. procédure étape par étape. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

METTRE À JOUR:

Le layer-listpeut être encore plus simple comme celui-ci (qui accepte également les dessins vectoriels pour le logo centré, contrairement à la <bitmap>balise):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Background color -->
    <item android:drawable="@color/gray"/>

    <!-- Logo at the center of the screen -->
    <item
        android:drawable="@mipmap/ic_launcher"
        android:gravity="center"/>
</layer-list>
Abhi
la source
1
C'est vraiment génial, mais comment puis-je ajouter du texte sous lemipmap/ic_launcher
Hasan A Yousef
6
C'est la meilleure réponse. La raison est que lors de l'utilisation des solutions ci-dessus, il y a un retard dans le démarrage visuel de l'application.
Jnr
un autre correctif pour contrôler le bitmap stackoverflow.com/questions/23079355/…
amorenew
1
Cela devrait être la réponse acceptée, toutes les autres donnent simplement l'impression que l'application n'a jamais démarré du point de vue de l'utilisateur. Un dessin plus simple layer-listpeut être celui-ci: <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Background color --> <item android:drawable="@color/white"/> <!-- Logo at the center of the screen --> <item android:drawable="@mipmap/ic_launcher" android:gravity="center"/> </layer-list>
Franco
Cette solution ne résout pas le problème lorsque nous voulons changer la couleur d'arrière-plan dans la liste des calques par programmation (dans votre exemple du gris par exemple au bleu). Dans ce scénario, le premier écran gris apparaît pendant une seconde ou deux, puis le fond bleu est défini!
Mohammad Afrashteh
71

Créez un style dans votre style.xml comme suit:

<style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

et utilisez-le avec votre activité dans AndroidManifest comme:

<activity android:name=".ActivitySplash" android:theme="@style/Theme.Transparent">
Tarun
la source
8

Vous devriez lire ce super article de Cyril Mottier: le lancement de l'application Android rendu magnifique

Vous devez personnaliser votre Themedans style.xml et éviter de le personnaliser en onCreatetant que ActionBar.setIcon / setTitle / etc.

Consultez également la documentation sur les conseils de performance de Google.

Utilisez Trace Viewet Hierarchy Viewerpour afficher l'heure d'affichage de vos vues: Optimisation des performances Android / Réglage des performances sur Android

Utilisez AsyncTaskpour afficher certaines vues.

fllo
la source
6

Ceci est mon AppTheme sur un exemple d'application:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Comme vous pouvez le voir, j'ai les couleurs par défaut, puis j'ai ajouté android:windowIsTranslucentet défini sur true.

Pour autant que je sache en tant que développeur Android, c'est la seule chose que vous devez définir pour masquer l'écran blanc au démarrage de l'application.

Luiscosta
la source
4

Les deux propriétés utilisent l'un d'entre eux.

    <style name="AppBaseThemeDark" parent="@style/Theme.AppCompat">
            <!--your other properties -->
            <!--<item name="android:windowDisablePreview">true</item>-->
            <item name="android:windowBackground">@null</item>
            <!--your other properties -->
    </style>
Sohail Zahid
la source
4

La réponse user543 est parfaite

<activity
        android:name="first Activity Name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

Mais:

Votre activité LAUNCHER doit étendre Activity , pas AppCompatActivity comme il est venu par défaut!

Igor Fridman
la source
J'ai essayé cette solution plusieurs fois car partout j'ai écrit cette même solution, cela ne pouvait pas fonctionner -> mais votre MAIS gagnez du temps mon activité étend AppCompatActivity c'est pourquoi cela ne fonctionne pas je l'ai changé en activité maintenant cela fonctionne merci mec !!
Rucha Bhatt Joshi
4

Le fond blanc provient de l'Apptheme.You peut afficher quelque chose d'utile comme le logo de votre application au lieu d'un écran blanc.il peut être fait en utilisant un thème personnalisé.

android:windowBackground=""

attribut. La valeur d'attribut peut être une image ou une liste en couches ou n'importe quelle couleur.

Rajesh.k
la source
Cela fonctionne, mieux si vous définissez une couleur transparente sur la fenêtre. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai
Cela devrait être la réponse acceptée. Quoi qu'il en soit, savez-vous comment ajouter l'animation de mise à l'échelle comme une application YouTube.
pratham kesarkar
Au lieu de blanc maintenant, c'est noir.
Ümañg ßürmån
2

Vous trouverez ci-dessous le lien qui suggère comment concevoir un écran Splash. Pour éviter un arrière-plan blanc / noir, nous devons définir un thème avec un arrière-plan de démarrage et définir ce thème pour qu'il éclabousse dans le fichier manifeste.

https://android.jlelse.eu/right-way-to-create-splash-screen-on-android-e7f1709ba154

splash_background.xml dans le dossier res / drawable

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

 <item android:drawable=”@color/colorPrimary” />

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

</layer-list>

Ajouter ci-dessous les styles

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <!-- Splash Screen theme. -->
    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_background</item>
    </style>

Dans le thème du jeu de manifestes comme indiqué ci-dessous

<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>
    </activity>
Rocheux
la source
2

J'ai également eu le même problème dans l'un de mes projets. Je l'ai résolu en ajoutant quelques paramètres suivants dans le thème fourni à l'écran de démarrage.

<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>

Vous pouvez trouver la raison et la résolution dans ce billet de blog écrit par moi. J'espère que ça aide.

divaPrajapati09
la source
Veuillez ajouter les détails directement à votre réponse. Les liens peuvent devenir invalides, c'est pourquoi nous aimons que la réponse contienne le contenu réel, le lien n'étant que complémentaire.
OOBalance
1

Il peut être résolu en définissant le thème dans votre manifeste comme

<activity
        android:name=".MySplashActivityName"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

et après cela, si vous obtenez
java.lang.IllegalStateException: vous devez utiliser un thème Theme.AppCompat (ou un descendant) avec cette activité.
vous devrez peut-être étendre Activity au lieu d' AppCompatActivity dans votre MySplashActivity.

J'espère que ça aide!

M. lapin
la source
1

Le fond blanc est causé par le démarrage d'Android pendant que l'application se charge en mémoire, et cela peut être évité si vous ajoutez simplement ces 2 lignes de code sous SplashTheme.

<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>
Farid Haq
la source
0

vous devez désactiver les paramètres du studio Android Instant Run.

Fichier> Paramètres> Génération, Exécution, Déploiement> Exécution instantanée décochez toutes les options qui y sont affichées.

Remarque: le problème d'écran blanc dû à l' exécution instantanée concerne uniquement les versions de débogage, ce problème n'apparaîtra pas sur les versions de version.

Mina Farid
la source
0

Essayez le code suivant:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

Ce code fonctionne pour moi et fonctionnera sur tous les appareils Android.

Hitesh sapra
la source
Les réponses au code uniquement sont déconseillées. Veuillez cliquer sur modifier et ajouter quelques mots résumant la façon dont votre code répond à la question, ou peut-être expliquer en quoi votre réponse diffère de la / des réponses précédentes. De l'avis
Nick
0

Sa solution est très simple!

Il y a trois raisons fondamentales à ce problème

  1. Vous effectuez une tâche lourde / longue / complexe dans la fonction onCreateVeiw.
  2. Si vous utilisez Thread. La durée de veille des threads peut alors être très longue .
  3. Si vous utilisez une bibliothèque tierce . Ce qui est initialisé au moment du démarrage de l' application, cela peut entraîner ce problème.

Solutions:

Solution 1:

  Remove the Heavy Task from onCreateView() function and place it some where appropriate place.

Solution 2:

  Reduce the Thread Sleep time.

Solution 3:

  Remove the Third party library at app initialize at implement them with some good strategy.

Dans mon cas, j'utilise Sugar ORM qui pose ce problème.

Partagez pour vous améliorer.

Sheharyar Ejaz
la source
0

Cela a résolu le problème:

Modifiez votre fichier styles.xml:


Collez le code ci-dessous:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

</resources>

Et n'oubliez pas de faire les modifications dans le fichier AndroidManifest.xml . ( nom du thème )

Faites attention à l'ordre de déclaration des activités dans ce fichier.

Julien Jm
la source
0
I encountered a similar problem and to overcome it, I implemented the code below in styles, i.e res->values->styles->resource tag 
<item name="android:windowDisablePreview">true</item>

Here is the whole code:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDisablePreview">true</item>
</style>
Emmanuel Ametepee
la source