Wie behebe ich den weißen Bildschirm in der App?


111

Ich habe eine Android-App, die beim Start 2 Sekunden lang einen weißen Bildschirm anzeigt. Meine anderen Apps tun dies nicht, aber diese. Ich habe auch einen Begrüßungsbildschirm implementiert, in der Hoffnung, dass dies behoben wird. Sollte ich die Ruhezeit meines Begrüßungsbildschirms verlängern? Vielen Dank.


1
Die Aktivität, die Sie starten, dauert zu lange, um ihren Beitrag zu leisten onCreate. Versuchen Sie in dieser Aktivität nur "setContentView" und überprüfen Sie, ob diese Verzögerung weg ist.
Sherif elKhatib

1
Entschuldigung, ich bin ein Neuling und ich habe keine Erfahrung mit Java. Kannst du das bitte klar erklären? und bitte geben Sie eine "Antwort", damit ich es ankreuzen kann :)
Anonym

1
Verwenden Sie Java oder C # in Ihrem Projekt?
Sherif elKhatib


Antworten:


104

Erwähnen Sie einfach das transparente Thema für die Startaktivität in der Datei AndroidManifest.xml.

Mögen:

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

und erweitern Sie diesen Bildschirm mit ActivityKlasse anstelle von AppCompatActivity.

mögen :

public class SplashScreenActivity extends Activity{

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

4
aber using final ActionBar actionBar = getActionBar();wird null zurückgeben, wenn das Thema durchscheinend ist
Jemand irgendwo

16
Pankaj - ja, ich habe erfahren, dass die schlechte Benutzeroberfläche auf das "Vorschau" -Fenster zurückzuführen ist ... anscheinend hat jemand bei Google entschieden, dass die Verwendung eines weißen Vorschaufensters standardmäßig wirklich fantastisch ist. In einer App mit dunklem Hintergrund ist dies jedoch eine wirklich schlechte Idee. Die Lösung besteht darin, einen benutzerdefinierten Stil für Ihre App zu erstellen und "android: windowBackground" für die Farbe anzugeben, die Sie verwenden möchten. Siehe den Abschnitt "Das perfekte Vorschaufenster" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Jemand irgendwo

2
@ Hagai L Es gibt mir einen Fehler wie "java.lang.IllegalStateException: Sie müssen für diese Aktivität ein Theme.AppCompat-Thema (oder einen Nachkommen) verwenden."
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" hat bei mir nicht funktioniert, irgendwelche Vorschläge?
Jay

1
@TejaDroid Um den Stoppfehler "java.lang.IllegalStateException" zu erhalten, müssen Sie Ihre Aktivität um android.app.Activity erweitern. Im Moment verwenden Sie AppCompactActivity. Für AppCompactActivity können Sie also keine normalen Themen verwenden.
Bereit Android

166

Stellen Sie dies in einen benutzerdefinierten Stil und es löst alle Probleme. Wenn Sie den hackigen durchscheinenden Fix verwenden, werden Ihre Taskleiste und die Navigationsleiste durchscheinend und der Begrüßungs- oder Hauptbildschirm sieht aus wie Spaghetti.

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


3
Thx Mann, vor viel Ärger gerettet. Anfangs fiel es mir schwer, den Sollwert zu erreichen. Es wird der Hauptthemenblock sein: Inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </ item>` sollte der Einstiegspunkt im Hauptstil sein .xml
HumaN

2
Vielen Dank! Legen Sie es in style.xml im Ordner res in style tag name = "AppTheme" (oder welches Thema Sie im Manifest verwenden)
Dimmduh

Hat für mich gearbeitet. Danke dir.
Benutzer1510006

Ich denke, es sollte als Antwort akzeptiert werden, da viele Entwickler benutzerdefinierte Themen verwenden
Sviatoslav Zaitsev

super hilfreich :)
jasan

74

Geben Sie hier die Bildbeschreibung ein

Wie Sie Tube .. anfangs zeigen sie Symbolbildschirm anstelle von weißem Bildschirm. Und nach 2 Sekunden wird der Startbildschirm angezeigt.

Erstellen Sie zunächst ein XML-Zeichen 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>

Als Nächstes legen Sie dies als Hintergrund für Ihre Splash-Aktivität im Thema fest. Navigieren Sie zu Ihrer Datei styles.xml und fügen Sie ein neues Thema für Ihre Begrüßungsaktivität hinzu

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

Legen Sie in Ihrem neuen SplashTheme das Fensterhintergrundattribut auf Ihr XML-Zeichenelement fest. Konfigurieren Sie dies als Thema Ihrer Splash-Aktivität in Ihrer 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>

Dieser Link gibt, was Sie wollen. Schritt für Schritt. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

AKTUALISIEREN:

Das layer-listkann noch einfacher wie folgt (die auch Vektor Drawables für das zentrierte Logo, anders als die akzeptiert <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
Das ist wirklich toll, aber wie kann ich Text untermipmap/ic_launcher
Hasan A Yousef

6
Dies ist die beste Antwort. Grund dafür ist, dass bei Verwendung der oben genannten Lösungen der visuelle Start der App verzögert wird.
Jnr

ein weiterer Fix zur Steuerung der Bitmap stackoverflow.com/questions/23079355/…
amorenew

1
Dies sollte die akzeptierte Antwort sein, alle anderen lassen es nur so aussehen, als ob die App aus Anwendersicht nie gestartet wurde. Eine einfachere ziehbar layer-listkann dies: <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

Diese Lösung löst das Problem nicht, wenn wir die Hintergrundfarbe in der Ebenenliste programmgesteuert ändern möchten (in Ihrem Beispiel von Grau zB nach Blau). In diesem Szenario wird der erste graue Bildschirm für ein oder zwei Sekunden angezeigt, dann wird der blaue Hintergrund festgelegt!
Mohammad Afrashteh

71

Erstellen Sie einen Stil in Ihrer style.xml wie folgt:

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

und verwenden Sie es mit Ihrer Aktivität in AndroidManifest als:

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

8

Sie sollten diesen großartigen Beitrag von Cyril Mottier lesen: Der Start der Android-App ist großartig

Sie müssen Ihre Themein style.xml anpassen und vermeiden, sie in Ihrer onCreateals ActionBar.setIcon / setTitle / etc.

Siehe auch die Dokumentation zu Leistungstipps von Google.

Verwenden Sie Trace Viewund Hierarchy Viewer, um die Zeit zum Anzeigen Ihrer Ansichten anzuzeigen: Android-Leistungsoptimierung / Leistungsoptimierung unter Android

Verwenden Sie AsyncTaskdiese Option , um einige Ansichten anzuzeigen.


6

Dies ist mein AppTheme für eine Beispiel-App:

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

Wie Sie sehen können, habe ich die Standardfarben und dann habe ich die hinzugefügt android:windowIsTranslucentund auf eingestellt true.

Soweit ich als Android-Entwickler weiß, ist dies das einzige, was Sie einstellen müssen, um den weißen Bildschirm beim Start der Anwendung auszublenden.


4

Beide Eigenschaften verwenden eine von ihnen.

    <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

Die Antwort von user543 ist perfekt

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

Aber:

Sie sind LAUNCHER-Aktivität muss Aktivität erweitern , nicht AppCompatActivity, wie es standardmäßig kam!


Ich habe diese Lösung viele Male ausprobiert, da überall dieselbe Lösung geschrieben wurde. Sie konnte nicht funktionieren.
Rucha Bhatt Joshi

4

Der weiße Hintergrund stammt aus dem Apptheme. Sie können etwas Nützliches wie Ihr Anwendungslogo anstelle des weißen Bildschirms anzeigen. Dies kann mithilfe eines benutzerdefinierten Themas erfolgen. Fügen Sie in Ihrem App-Theme einfach etwas hinzu

android:windowBackground=""

Attribut. Der Attributwert kann ein Bild oder eine Ebenenliste oder eine beliebige Farbe sein.


Dies funktioniert. Besser, wenn Sie die transparente Farbe für das Fenster festlegen. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

Dies sollte die akzeptierte Antwort sein. Wie auch immer, wissen Sie, wie man die Animation der Skalierung wie die YouTube-App hinzufügt.
Pratham Kesarkar

Anstelle von Weiß ist es jetzt schwarz.
Ümañg ßürmån

2

Unten finden Sie den Link zum Entwerfen des Begrüßungsbildschirms. Um einen weiß / schwarzen Hintergrund zu vermeiden, müssen wir ein Thema mit Begrüßungshintergrund definieren und dieses Thema so einstellen, dass es in der Manifestdatei angezeigt wird.

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

splash_background.xml im Ordner 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>

Fügen Sie unten Stile hinzu

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

Im Manifest-Set-Thema wie unten gezeigt

<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

Ich hatte auch das gleiche Problem in einem meiner Projekte. Ich habe es behoben, indem ich dem Begrüßungsbildschirm einige der folgenden Parameter hinzugefügt habe.

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

Den Grund und die Lösung finden Sie in diesem von mir verfassten Blog-Beitrag . Ich hoffe es hilft.


Bitte fügen Sie die Details direkt zu Ihrer Antwort hinzu. Links können ungültig werden. Deshalb möchten wir, dass die Antwort den eigentlichen Inhalt enthält, wobei der Link nur ergänzend ist.
OOBalance

1

Sie können dies beheben, indem Sie das Thema in Ihrem Manifest als festlegen

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

und danach, wenn Sie
java.lang.IllegalStateException erhalten: Sie müssen für diese Aktivität ein Theme.AppCompat-Design (oder einen Nachkommen) verwenden.
In diesem Fall müssen Sie möglicherweise Activity anstelle von AppCompatActivity in Ihrer MySplashActivity erweitern.

Ich hoffe es hilft!


1

Weißer Hintergrund wird durch das Starten von Android verursacht, während die App im Speicher geladen wird. Dies kann vermieden werden, wenn Sie nur diese 2 Codezeilen unter SplashTheme hinzufügen.

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

0

Sie sollten Instant Run Android Studio-Einstellungen deaktivieren.

Datei> Einstellungen> Erstellen, Ausführen, Bereitstellen> Sofortige Ausführung Deaktivieren Sie alle dort angezeigten Optionen.

Hinweis: Das Problem mit dem weißen Bildschirm aufgrund der sofortigen Ausführung tritt nur bei Debug-Builds auf. Dieses Problem tritt bei Release-Builds nicht auf.


0

Versuchen Sie den folgenden Code:

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

Dieser Code funktioniert für mich und funktioniert auf allen Android-Geräten.


Von Nur-Code-Antworten wird abgeraten. Klicken Sie auf Bearbeiten und fügen Sie einige Wörter hinzu, die zusammenfassen, wie Ihr Code die Frage beantwortet, oder erklären Sie möglicherweise, wie sich Ihre Antwort von der vorherigen Antwort / den vorherigen Antworten unterscheidet. Aus dem Rückblick
Nick

0

Die Lösung ist sehr einfach!

Es gibt drei grundlegende Gründe für dieses Problem

  1. Sie führen eine schwere / lange laufende / komplexe Aufgabe in der onCreateVeiw-Funktion aus.
  2. Wenn Sie Thread verwenden. Dann kann die Thread-Schlafzeit sehr groß sein.
  3. Wenn Sie eine Bibliothek eines Drittanbieters verwenden . Was beim Start der App initialisiert wird, kann zu diesem Problem führen.

Lösungen:

Lösung 1:

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

Lösung 2:

  Reduce the Thread Sleep time.

Lösung 3:

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

In meinem Fall verwende ich Sugar ORM, was dieses Problem verursacht.

Teilen, um sich zu verbessern.


0

Dies löste das Problem:

Bearbeiten Sie Ihre Datei styles.xml:


Fügen Sie den folgenden Code ein:

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

Und vergessen Sie nicht, die Änderungen in der Datei AndroidManifest.xml vorzunehmen . ( Name des Themas )

Achten Sie auf die Deklarationsreihenfolge der Aktivitäten in dieser Datei.


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.