Jak naprawić biały ekran podczas uruchamiania aplikacji?

111

Mam aplikację na Androida, która wyświetla biały ekran przez 2 sekundy po uruchomieniu. Moje inne aplikacje tego nie robią, ale ta robi. Zaimplementowałem również ekran powitalny z nadzieją, że to naprawi. Czy powinienem wydłużyć czas uśpienia ekranu powitalnego? Dzięki.

Anonimowy
źródło
1
Czynność, którą zaczynasz, wykonuje swoją onCreateczęść zbyt długo . Spróbuj po prostu „setContentView” w tym działaniu i sprawdź, czy to opóźnienie minęło.
Sherif elKhatib,
1
przepraszam, jestem nowicjuszem i nie mam doświadczenia z Javą, czy możesz wyjaśnić jasno? i proszę udzielić „odpowiedzi”, abym mógł ją zaznaczyć :)
Anonimowy
1
Czy w swoim projekcie używasz języka Java lub C # ?
Sherif elKhatib,
1
Mam nadzieję, że ten link ci pomoże: cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Mikalai Daronin
geeksforandroidgeeks.com/android/splash_issue Proszę przejść przez link
Vivek Kumar Samele

Odpowiedzi:

104

Wystarczy wspomnieć o przezroczystym motywie działania początkowego w pliku AndroidManifest.xml.

Lubić:

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

i rozszerz ten ekran o Activityklasę zamiast AppCompatActivity.

lubić :

public class SplashScreenActivity extends Activity{

  ----YOUR CODE GOES HERE----
}
user543
źródło
4
ale użycie final ActionBar actionBar = getActionBar();zwróci wartość null, gdy motyw jest półprzezroczysty
Someone Somewhere
17
Pankaj - tak, dowiedziałem się, że złe wrażenia z interfejsu użytkownika wynikały z okna „podglądu” ... najwyraźniej ktoś w Google zdecydował, że domyślnie białe okno podglądu jest naprawdę świetne. Jednak w aplikacji, która używa ciemnego tła, to naprawdę zły pomysł. Rozwiązaniem jest utworzenie niestandardowego stylu dla aplikacji i określenie koloru „android: windowBackground” jako koloru, którego chcesz użyć. Zobacz sekcję „Idealne okno podglądu” cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Someone Somewhere
2
@Hagai L Wystąpił błąd, taki jak „java.lang.IllegalStateException: Musisz użyć motywu Theme.AppCompat (lub elementu podrzędnego) w tym działaniu”.
TejaDroid
1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" nie działa dla mnie, jakieś sugestie?
jay
1
@TejaDroid, aby uzyskać błąd zatrzymania „java.lang.IllegalStateException”, musisz rozszerzyć swoją aktywność o android.app.Activity, teraz używasz AppCompactActivity. Dlatego w przypadku AppCompactActivity nie można używać zwykłych motywów.
Gotowy na Androida
167

Umieść to w niestandardowym stylu i rozwiązuje wszystkie problemy. Użycie hacky, półprzezroczystej poprawki sprawi, że pasek zadań i pasek nawigacji staną się półprzezroczyste, a ekran powitalny lub ekran główny będzie wyglądał jak spaghetti.

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

ireq
źródło
3
Dzięki człowiekowi, uratowano od wielu kłopotów. Początkowo ciężko mi było uzyskać punkt zwrotny. Będzie to główny blok motywu: inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` powinno być punktem wejścia w głównym stylu .xml
HumaN
2
Dzięki! Umieść go w style.xml w folderze res do tagu stylu name = "AppTheme" (lub jakiego motywu używasz w
pliku
Pracował dla mnie. Dziękuję Ci.
user1510006
Myślę, że należy zaakceptować odpowiedź, ponieważ wielu programistów używa niestandardowych motywów
Sviatoslav Zajcev
super pomocny :)
jasan
74

wprowadź opis obrazu tutaj

Tak jak ty tube ... początkowo pokazują ekran ikon zamiast białego ekranu. A po 2 sekundach pokazuje ekran główny.

Najpierw utwórz XML do rysowania w 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>

Następnie ustawisz to jako tło swojej aktywności powitalnej w motywie. Przejdź do pliku styles.xml i dodaj nowy motyw dla swojej aktywności powitania

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

W nowym SplashTheme ustaw atrybut tła okna na swój XML do rysowania. Skonfiguruj to jako motyw aktywności powitalnej w pliku 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>

Ten link daje to, czego chcesz. procedura krok po kroku. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

AKTUALIZACJA:

layer-listMoże być jeszcze prostsze tak (który przyjmuje również kanału alfa wektorowa dla środku logo, w przeciwieństwie do <bitmap>znacznika):

<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
źródło
1
To naprawdę świetne, ale jak mogę dodać tekst pod mipmap/ic_launcher
hasłem
6
To najlepsza odpowiedź. Powodem jest to, że podczas korzystania z powyższych rozwiązań występuje opóźnienie w wizualnym uruchomieniu aplikacji.
Jnr
jeszcze jedna poprawka do sterowania bitmapy stackoverflow.com/questions/23079355/...
amorenew
1
To powinna być akceptowana odpowiedź, wszystkie inne sprawiają, że wygląda na to, że aplikacja nigdy nie została uruchomiona z punktu widzenia użytkownika. Prostsza lista layer-listmoże wyglądać następująco: <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
To rozwiązanie nie rozwiązuje problemu, gdy chcemy programowo zmienić kolor tła na liście warstw (w twoim przykładzie z szarego np. Na niebieski). W tym scenariuszu pierwszy szary ekran pojawia się na sekundę lub dwie, a następnie ustawiane jest niebieskie tło!
Mohammad Afrashteh
71

Utwórz styl w you style.xml w następujący sposób:

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

i używaj go do swojej aktywności w AndroidManifest jako:

<activity android:name=".ActivitySplash" android:theme="@style/Theme.Transparent">
Tarun
źródło
8

Powinieneś przeczytać ten wspaniały post autorstwa Cyrila Mottiera: Wspaniałe uruchomienie aplikacji na Androida

Musisz dostosować swój Themew style.xml i unikać dostosowywania w swoim onCreatejako ActionBar.setIcon / setTitle / etc.

Zobacz także dokumentację dotyczącą wskazówek dotyczących wydajności opracowaną przez Google.

Użyj Trace Viewi, Hierarchy Vieweraby zobaczyć czas wyświetlania widoków: Optymalizacja wydajności Androida / dostrajanie wydajności w systemie Android

Służy AsyncTaskdo wyświetlania niektórych widoków.

fllo
źródło
6

To jest mój AppTheme w przykładowej aplikacji:

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

Jak widać, mam domyślne kolory a potem dodałem android:windowIsTranslucenti ustawiłem na true.

O ile wiem jako programista Androida, jest to jedyna rzecz, którą musisz ustawić, aby ukryć biały ekran na starcie aplikacji.

luiscosta
źródło
4

Obie właściwości wykorzystują jeden z nich.

    <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
źródło
4

User543 odpowiedź jest idealny

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

Ale:

Aktywność You'r LAUNCHER musi rozszerzać Activity , a nie AppCompatActivity, ponieważ jest domyślnie!

Igor Fridman
źródło
Próbowałem tego rozwiązania wiele razy, ponieważ wszędzie pisałem to samo rozwiązanie, nie zadziałało -> ale oszczędzaj mój czas, ale oszczędzaj mój czas, moja aktywność rozszerza AppCompatActivity, dlatego nie działa, zmieniłem to na aktywność, teraz działa, dziękuję!
Rucha Bhatt Joshi
4

Białe tło pochodzi z Apptheme. Zamiast białego ekranu możesz wyświetlić coś pożytecznego, na przykład logo aplikacji. Można to zrobić za pomocą niestandardowego motywu. W aplikacji Motyw wystarczy dodać

android:windowBackground=""

atrybut. Wartością atrybutu może być obraz, lista warstw lub dowolny kolor.

Rajesh.k
źródło
To działa, lepiej, jeśli ustawisz przezroczysty kolor na okno. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai
To powinna być akceptowana odpowiedź. W każdym razie wiesz, jak dodać animację skalowania, taką jak aplikacja YouTube.
pratham kesarkar
Zamiast białego jest teraz czarny.
Ümañg ßürmån
2

Poniżej znajduje się link sugerujący, jak zaprojektować ekran powitalny. Aby uniknąć białego / czarnego tła, musimy zdefiniować motyw z tłem powitalnym i ustawić ten motyw jako powitalny w pliku manifestu.

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

splash_background.xml w folderze 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>

Dodaj poniższe style

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

W motywie zestawu Manifest, jak pokazano poniżej

<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>
Skalisty
źródło
2

miałem również ten sam problem w jednym z moich projektów. Rozwiązałem to, dodając kilka następujących parametrów w motywie dostarczonym do ekranu powitalnego.

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

Możesz znaleźć przyczynę i rozwiązanie w tym wpisie na blogu napisanym przeze mnie. Mam nadzieję, że to pomoże.

divaPrajapati09
źródło
Dodaj szczegóły bezpośrednio do swojej odpowiedzi. Linki mogą stać się nieważne, dlatego zależy nam, aby odpowiedź zawierała rzeczywistą treść, a link jest tylko uzupełnieniem.
OOBalance
1

Można to naprawić, ustawiając motyw w swoim manifeście jako

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

a następnie, jeśli otrzymujesz
java.lang.IllegalStateException: Musisz użyć motywu Theme.AppCompat (lub elementu podrzędnego) z tym działaniem.
wtedy może być konieczne rozszerzenie Activity zamiast AppCompatActivity w MySplashActivity.

Mam nadzieję, że to pomoże!

Panie Króliku
źródło
1

Białe tło jest spowodowane tym, że system Android uruchamia się, gdy aplikacja ładuje się w pamięci, i można tego uniknąć, dodając po prostu tę 2 linie kodu pod SplashTheme.

<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>
Farid Haq
źródło
0

należy wyłączyć ustawienia Instant Run Android Studio.

Plik> Ustawienia> Kompilacja, Wykonanie, Wdrożenie> Natychmiastowe uruchamianie odznacz wszystkie wyświetlone tam opcje.

Uwaga: Problem z białym ekranem spowodowany natychmiastowym uruchomieniem dotyczy tylko kompilacji debugowania, ten problem nie będzie się pojawiał w kompilacjach wydań.

Mina Farid
źródło
0

Wypróbuj następujący kod:

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

Ten kod działa dla mnie i będzie działać na wszystkich urządzeniach z Androidem.

Hitesh sapra
źródło
Odpowiedzi zawierające tylko kod są odradzane. Kliknij edytuj i dodaj kilka słów podsumowujących, w jaki sposób Twój kod odpowiada na pytanie, lub może wyjaśnij, w jaki sposób Twoja odpowiedź różni się od poprzedniej odpowiedzi / odpowiedzi. Z recenzji
Nick
0

Jego rozwiązanie jest bardzo proste!

Istnieją trzy podstawowe przyczyny tego problemu

  1. Robisz ciężkie / długie uruchomiony / skomplikowane zadanie w onCreateVeiw funkcję.
  2. Jeśli używasz Thread. Wtedy czas usypiania nici może być bardzo długi.
  3. Jeśli korzystasz z dowolnej biblioteki innej firmy . Który jest inicjowany podczas uruchamiania aplikacji , może powodować ten problem.

Rozwiązania:

Rozwiązanie 1:

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

Rozwiązanie 2:

  Reduce the Thread Sleep time.

Rozwiązanie 3:

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

W moim przypadku używam Sugar ORM, który prowadzi do tego problemu.

Udostępnij, aby ulepszyć.

Sheharyar Ejaz
źródło
0

To rozwiązało problem:

Edytuj swój plik styles.xml:


Wklej poniższy kod:

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

I nie zapomnij wprowadzić zmian w pliku AndroidManifest.xml . ( nazwa motywu )

Uważaj na kolejność deklaracji działań w tym pliku.

Julien Jm
źródło
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
źródło