Come riparare lo schermo bianco all'avvio dell'app?


111

Ho un'app per Android che mostra una schermata bianca per 2 secondi all'avvio. Le mie altre app non lo fanno, ma questa sì. Ho anche implementato uno splashscreen con la speranza che potesse risolvere questo problema. Devo aumentare il tempo di sospensione della schermata iniziale? Grazie.


1
L'attività che stai iniziando impiega troppo tempo a fare la sua onCreateparte. Prova a "impostareContentView" in quell'attività e controlla se questo ritardo è passato.
Sherif elKhatib

1
scusa sono un principiante e non ho esperienza con java, puoi spiegarmi chiaramente? e per favore dai una "risposta" in modo che possa spuntarla :)
Anonimo

1
Stai usando java o c # nel tuo progetto?
Sherif elKhatib


Risposte:


104

Basta menzionare il tema trasparente per l'attività iniziale nel file AndroidManifest.xml.

Piace:

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

ed estendi lo schermo con la Activityclasse al posto di AppCompatActivity.

piace :

public class SplashScreenActivity extends Activity{

  ----YOUR CODE GOES HERE----
}

4
ma l'utilizzo final ActionBar actionBar = getActionBar();restituirà null quando il tema è traslucido
Someone Somewhere,

16
Pankaj - sì, ho imparato che la cattiva esperienza dell'interfaccia utente era dovuta alla finestra di "anteprima" ... a quanto pare qualcuno in Google ha deciso che una finestra di anteprima bianca era davvero fantastica da usare di default. Tuttavia, in un'app che utilizza uno sfondo scuro è davvero una cattiva idea. La soluzione è creare uno stile personalizzato per la tua app e specificare "android: windowBackground" con il colore che desideri utilizzare. Vedere la sezione "la finestra di anteprima perfetta" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Someone Somewhere

2
@Hagai L Mi dà un errore del tipo "java.lang.IllegalStateException: devi utilizzare un tema Theme.AppCompat (o discendente) con questa attività."
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" non ha funzionato per me, qualche suggerimento?
Jay

1
@TejaDroid per ottenere l'errore di arresto "java.lang.IllegalStateException" devi estendere la tua attività da android.app.Activity, in questo momento stai utilizzando AppCompactActivity. Quindi per AppCompactActivity non è possibile utilizzare temi normali.
Pronto Android

167

Mettilo in uno stile personalizzato e risolverà tutti i problemi. L'uso della correzione traslucida hacky renderà la barra delle applicazioni e la barra di navigazione traslucide e farà sembrare la schermata iniziale o la schermata principale come spaghetti.

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


3
Grazie uomo, salvato da molte seccature. Inizialmente stavo facendo fatica a ottenere il punto di partenza. Sarà il blocco del tema principale: inline "<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>" dovrebbe essere il punto di ingresso nello stile principale .xml
HumaN

2
Grazie! Mettilo in style.xml nella cartella res nel tag di stile name = "AppTheme" (o quale tema usi in manifest)
Dimmduh

Ha funzionato per me. Grazie.
user1510006

Penso che dovrebbe essere accettata la risposta, perché molti sviluppatori usano temi personalizzati
Sviatoslav Zaitsev

super utile :)
jasan

74

inserisci qui la descrizione dell'immagine

Come You Tube .. inizialmente mostrano la schermata delle icone invece della schermata bianca. E dopo 2 secondi mostra la schermata iniziale.

prima crea un disegnabile XML in 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>

Successivamente, lo imposterai come sfondo della tua attività splash nel tema. Passa al tuo file styles.xml e aggiungi un nuovo tema per la tua attività splash

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

Nel tuo nuovo SplashTheme, imposta l'attributo di sfondo della finestra sul tuo disegnabile XML. Configura questo come tema della tua attività splash nel tuo 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>

Questo collegamento dà quello che vuoi. procedura passo passo. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

AGGIORNARE:

La layer-listpuò essere ancora più semplice come questo (che accetta anche drawable vettoriali per il logo centrato, a differenza del <bitmap>tag):

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

1
Questo è davvero fantastico, ma come posso aggiungere del testo sottomipmap/ic_launcher
Hasan A Yousef

6
Questa è la migliore risposta. Il motivo è che quando si utilizzano le soluzioni di cui sopra, si verifica un ritardo nell'avvio visivo dell'app.
Giov.28

ancora una correzione per controllare la bitmap stackoverflow.com/questions/23079355/...
amorenew

1
Questa dovrebbe essere la risposta accettata, tutte le altre fanno sembrare che l'app non sia mai stata avviata dal punto di vista dell'utente. Un disegno più semplice layer-listpuò essere questo: <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

Questa soluzione non risolve il problema quando vogliamo cambiare il colore di sfondo nell'elenco dei livelli a livello di programmazione (nel tuo esempio da grigio ad esempio a blu). In questo scenario, viene visualizzata la prima schermata grigia per uno o due secondi, quindi viene impostato lo sfondo blu!
Mohammad Afrashteh

71

Crea uno stile nel tuo style.xml come segue:

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

e usalo con la tua attività in AndroidManifest come:

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

8

Dovresti leggere questo fantastico post di Cyril Mottier: Il lancio di app Android è stato meraviglioso

Devi personalizzare il tuo Themein style.xml ed evitare di personalizzare nel tuoonCreate come ActionBar.setIcon / setTitle / ecc.

Vedere anche la documentazione sui suggerimenti per le prestazioni di Google.

Usa Trace Viewe Hierarchy Viewerper vedere il tempo per visualizzare le tue visualizzazioni: Android Performance Optimization / Regolazione delle prestazioni su Android

Utilizzare AsyncTaskper visualizzare alcune visualizzazioni.


6

Questo è il mio AppTheme su un'app di esempio:

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

Come puoi vedere, ho i colori predefiniti e poi ho aggiunto android:windowIsTranslucente impostato sutrue .

Per quanto ne so come sviluppatore Android, questa è l'unica cosa che devi impostare per nascondere lo schermo bianco all'avvio dell'applicazione.


4

Entrambi i lavori di proprietà utilizzano uno qualsiasi di essi.

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

4

La risposta user543 è perfetta

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

Ma:

You'r LAUNCHER Activity deve estendere Activity , non AppCompatActivity come è venuto per impostazione predefinita!


ho provato questa soluzione molte volte poiché ovunque ha scritto la stessa soluzione, non poteva funzionare -> ma il tuo MA risparmia tempo la mia attività estende AppCompatActivity ecco perché non funziona l'ho cambiato in attività ora funziona grazie amico !!
Rucha Bhatt Joshi

4

Lo sfondo bianco proviene da Apptheme.Puoi mostrare qualcosa di utile come il logo della tua applicazione invece dello schermo bianco.Può essere fatto usando un tema personalizzato.nella tua app Theme basta aggiungere

android:windowBackground=""

attributo. Il valore dell'attributo può essere un'immagine, un elenco a più livelli o qualsiasi colore.


Funziona, meglio se imposti il ​​colore trasparente alla finestra. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

Questa dovrebbe essere la risposta accettata. Comunque sai come aggiungere l'animazione del ridimensionamento come l'app di YouTube.
pratham kesarkar

Invece del bianco ora è nero.
Ümañg ßürmån

2

Di seguito è riportato il collegamento che suggerisce come progettare la schermata iniziale. Per evitare lo sfondo bianco / nero, dobbiamo definire un tema con sfondo splash e impostare quel tema in modo che schizzi nel file manifest.

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

splash_background.xml all'interno della cartella 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>

Aggiungi sotto gli stili

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

In Manifest imposta il tema come mostrato di seguito

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

2

ho avuto lo stesso problema anche in uno dei miei progetti. L'ho risolto aggiungendo alcuni parametri seguenti nel tema fornito alla schermata iniziale.

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

Puoi trovare il motivo e la risoluzione in questo post sul blog scritto da me. Spero che sia d'aiuto.


Si prega di aggiungere i dettagli direttamente alla risposta. I link possono diventare non validi, ecco perché ci piace che la risposta contenga il contenuto effettivo, essendo il link solo supplementare.
OOBalance

1

Può essere risolto impostando il tema nel file manifest come

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

e successivamente se
ottieni java.lang.IllegalStateException: devi usare un tema Theme.AppCompat (o discendente) con questa attività.
allora potresti dover estendere Activity invece di AppCompatActivity nel tuo MySplashActivity.

Spero che sia d'aiuto!


1

Lo sfondo bianco è causato dall'avvio di Android mentre l'app viene caricata in memoria e può essere evitato se aggiungi questa 2 riga di codice sotto SplashTheme.

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

0

dovresti disabilitare le Impostazioni di Android Studio di Instant Run.

File> Impostazioni> Build, Execution, Deployment> Instant Run deseleziona tutte le opzioni mostrate lì.

Nota: il problema con la schermata bianca a causa di Instant Run è solo per le build di debug, questo problema non verrà visualizzato nelle build di rilascio.


0

Prova il codice seguente:

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

Questo codice funziona per me e funzionerà su tutti i dispositivi Android.


Le risposte di solo codice sono scoraggiate. Fai clic su modifica e aggiungi alcune parole che riassumono in che modo il tuo codice affronta la domanda, o forse spiega in che modo la tua risposta differisce dalla risposta / risposte precedenti. Dalla recensione
Nick

0

La sua soluzione è molto semplice!

Ci sono tre ragioni fondamentali per questo problema

  1. Stai eseguendo un'attività pesante / di lunga durata / complessa nella funzione onCreateVeiw.
  2. Se stai usando Thread. Quindi il tempo di sospensione del thread potrebbe essere molto elevato.
  3. Se stai utilizzando una libreria di terze parti . Che viene inizializzato all'avvio dell'app , potrebbe causare questo problema.

soluzioni:

Soluzione 1:

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

Soluzione 2:

  Reduce the Thread Sleep time.

Soluzione 3:

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

Nel mio caso sto usando Sugar ORM che porta questo problema.

Condividi per migliorare.


0

Questo ha risolto il problema:

Modifica il tuo file styles.xml:


Incolla il codice di seguito:

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

E non dimenticare di apportare le modifiche nel file AndroidManifest.xml . ( nome del tema )

Fare attenzione all'ordine di dichiarazione delle attività in questo file.


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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.