Як виправити білий екран у запуску програми?


111

У мене є додаток для android, який відображає білий екран протягом 2 секунд при запуску. Інші мої додатки цього не роблять, але це так. Я також реалізував splashscreen з надією, що це виправить. Чи варто збільшити час сну на екрані заставки? Дякую.


1
Діяльність, яку ви починаєте, займає занадто багато часу, щоб виконати свою onCreateроль. Спробуйте просто "встановитиContentView" у цій діяльності та перевірити, чи не затримано цю затримку.
Шериф ельКатіб

1
вибачте, що я новачок, і я не маю досвіду роботи з Java, чи можете ви поясніть, будь ласка, чітко? і будь ласка, дайте "відповідь", щоб я міг поставити галочку :)
Анонім

1
Ви використовуєте java або c # у своєму проекті?
Шериф ельКатіб

1
Сподіваюся, що це посилання допоможе вам: cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Миколай Даронін

Відповіді:


104

Просто згадайте прозору тему для початкової діяльності у файлі AndroidManifest.xml.

Подібно до:

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

і розгорніть цей екран Activityзамість класу AppCompatActivity.

подібно до :

public class SplashScreenActivity extends Activity{

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

4
але використання final ActionBar actionBar = getActionBar();не поверне нулю, коли Тема напівпрозора
Хтось десь

16
Pankaj - так, я дізнався, що поганий досвід користувальницького інтерфейсу пояснювався вікном "попереднього перегляду" ... Мабуть, хтось із Google вирішив, що біле вікно попереднього попереднього перегляду дійсно приголомшливо використовувати за замовчуванням. Однак у програмі, що використовує темний фон, це дуже погана ідея. Рішення полягає у створенні користувальницького стилю для вашої програми та вкажіть "android: windowBackground" для потрібного кольору. Дивіться розділ "ідеальне вікно попереднього перегляду" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Хтось десь

2
@Hagai L Це дасть мені помилку типу "java.lang.IllegalStateException: Вам потрібно використовувати тему Theme.AppCompat (або нащадка) з цією діяльністю."
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" не працював для мене, будь-які пропозиції?
Джей

1
@TejaDroid, щоб отримати помилку зупинки "java.lang.IllegalStateException", ви повинні розширити свою активність на android.app.Activity, зараз ви використовуєте AppCompactActivity. Тому для AppCompactActivity ви не можете використовувати звичайні теми.
Готовий Android

167

Поставте це у власному стилі, і це вирішить усі проблеми. Використання виправного напівпрозорого виправлення зробить панель завдань та панель навігації напівпрозорою та зробить заставку або головний екран схожим на спагетті.

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


3
Thx людина, врятований від безлічі клопотів. Спочатку мені було важко отримати налаштування. Це буде основний блок теми: inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` має бути точкою входу в основний стиль .xml
HumaN

2
Дякую! Помістіть його у style.xml у папці res у тег стилю name = "AppTheme" (або яку тему ви використовуєте у маніфесті)
Dimmduh

Працювали для мене. Дякую.
користувач1510006

Я думаю, що слід прийняти відповідь, тому що багато розробників використовують спеціальні теми
Святослав Зайцев

супер корисний :)
jasan

74

введіть тут опис зображення

Як у вас трубка .. спочатку вони показують екран піктограм замість білого екрана. А через 2 секунди відображається головний екран.

спершу створіть XML, який можна малювати в Res / Dravable.

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

Далі ви встановите це як тло дії вашого сплеску в темі. Перейдіть до файлу styles.xml та додайте нову тему для вашої активності

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

У своєму новому SplashTheme встановіть атрибут фону вікна для вашого XML, який можна малювати. Налаштуйте це як тему вашої активності за допомогою сплеску в 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>

Це посилання дає те, що ви хочете. покрокова процедура. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

ОНОВЛЕННЯ:

Це layer-listможе бути навіть простішим, як це (який також приймає векторні малюнки для центру з логотипом, на відміну від <bitmap>тегу):

<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
Це дійсно чудово, але як я можу додати текст у розділіmipmap/ic_launcher
Hasan A Yousef

6
Це найкраща відповідь. Причина полягає в тому, що при використанні вищевказаних рішень відбувається затримка візуального запуску програми.
Jnr

ще один фікс для управління растрових stackoverflow.com/questions/23079355 / ...
amorenew

1
Це має бути прийнятою відповіддю, всі інші просто роблять це схожим на те, що додаток ніколи не запускалося з точки зору користувача. Більш простим малюнком layer-listможе бути таке: <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>
Франко

Це рішення не вирішує проблему, коли ми хочемо програмно змінити колір тла у списку шарів (у вашому прикладі із сірого, наприклад, на синій). У цьому випадку спочатку з’являється сірий екран на секунду-дві, потім встановлюється синій фон!
Мохаммед Афраштех

71

Створіть у своєму стилі style.xml наступним чином:

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

і використовувати його у своїй діяльності в AndroidManifest як:

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

8

Ви повинні прочитати цей чудовий пост Кирила Моттьє: Запуск програми Android зробився чудовим

Вам потрібно налаштувати свій Themeстиль у style.xml і уникати налаштування у вашому onCreateфайлі як ActionBar.setIcon / setTitle / тощо.

Див. Також Документацію щодо порад щодо ефективності від Google.

Використовуйте Trace Viewта Hierarchy Viewerпереглядайте час для відображення своїх переглядів: Оптимізація продуктивності / Настроювання продуктивності Android на Android

Використовуйте AsyncTaskдля відображення деяких переглядів.


6

Це моя AppTheme на прикладі програми:

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

Як бачите, у мене кольори за замовчуванням, а потім я додав android:windowIsTranslucentі встановив його true.

Наскільки я знаю як розробник Android, це єдине, що потрібно встановити для того, щоб приховати білий екран на початку програми.


4

В обох властивостях працює будь-яка з них.

    <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

Відповідь user543 ідеальна

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

Але:

You'r LAUNCHER активність повинна extands активність , що не AppCompatActivity , як він прийшов за замовчуванням!


Я намагався це рішення багато разів, як скрізь писав це одне і те ж рішення, воно не могло працювати -> але ваш АЛЕ заощадити мій час, моя активність розширює AppCompatActivity, тому це не працює, я змінив його на діяльність, зараз він працює спасибі, людина!
Rucha Bhatt Joshi

4

Білий фон надходить з Apptheme. Ви можете показати щось корисне, як логотип програми замість білого екрана. Це можна зробити за допомогою спеціальної теми.У програмі Тема просто додайте

android:windowBackground=""

атрибут. Значенням атрибута може бути зображення або багатошаровий список або будь-який колір.


Це працює, краще, якщо ви встановите прозорий колір для вікна. <item name="android:windowBackground">@android:color/transparent</item>
Амол Дезай

Це має бути прийнятою відповіддю. У будь-якому разі ви знаєте, як додати анімацію масштабування, як додаток youtube.
pratham kesarkar

Замість Білого тепер чорний.
Ümañg ßürmån

2

Нижче наведено посилання, яке підказує, як створити екран Splash. Щоб уникнути білого / чорного тла, нам потрібно визначити тему з фоном сплеску та встановити цю тему, щоб вона сплеснула у файл маніфесту.

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

splash_background.xml у папці res / dravable

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

Додайте стилі нижче

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

У Manifest задайте тему, як показано нижче

<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

У мене також була така ж проблема в одному з мого проекту. Я вирішив це, додавши кілька наступних параметрів у тему, надану на екран сплеску.

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

Ви можете знайти причину та дозвіл у цій публікації блогу, написаній мною. Сподіваюся, це допомагає.


Будь ласка, додайте деталі безпосередньо до своєї відповіді. Посилання можуть стати недійсними, тому ми хочемо, щоб відповідь містила фактичний вміст, посилання лише доповнює.
OOBalance

1

Це можна виправити, встановивши тему у вашому маніфесті як

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

і після цього, якщо ви отримуєте
java.lang.IllegalStateException: з цією діяльністю потрібно використовувати тему (або нащадка) Theme.AppCompat.
тоді вам може знадобитися розширити Діяльність замість AppCompatActivity у MySplashActivity.

Сподіваюся, це допомагає!


1

Білий фон викликаний тим, що Android запускається під час завантаження програми на пам’ять, і цього можна уникнути, якщо просто додати цей 2 рядок коду під SplashTheme.

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

0

вам слід вимкнути Налаштування Android Studio Studio.

Файл> Налаштування> Збірка, Виконання, Розгортання> Миттєвий запуск зніміть прапорець Перевірити всі параметри, показані там.

Примітка: Випуск білого екрана через миттєвого запуску призначений лише для налагодження налагодження, цей випуск не з’явиться у версії версій.


0

Спробуйте наступний код:

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

Цей код працює для мене і працюватиме на всіх пристроях Android.


Відповіді, що стосуються лише коду, не враховують. Клацніть по редагуванню та додайте кілька слів, узагальнюючи те, як ваш код вирішує питання, або, можливо, поясніть, чим ваша відповідь відрізняється від попередньої відповіді / відповіді. З відгуку
Нік

0

Його рішення дуже просте!

Існують три основні причини цієї проблеми

  1. Ви виконуєте важке / тривале / складне завдання у функції onCreateVeiw.
  2. Якщо ви використовуєте Thread. Тоді час сплячої нитки може бути дуже великим.
  3. Якщо ви використовуєте будь-яку бібліотеку третьої сторони . Що ініціалізувати під час запуску програми , це може призвести до цієї проблеми.

Рішення:

Рішення 1:

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

Рішення 2:

  Reduce the Thread Sleep time.

Рішення 3:

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

У моєму випадку я використовую цукор ORM, який призводить до цієї проблеми.

Поділіться, щоб покращити.


0

Це вирішило проблему:

Відредагуйте файл styles.xml:


Вставте код нижче:

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

І не забудьте внести зміни у файл AndroidManifest.xml . ( назва теми )

Будьте уважні до порядку декларування дій у цьому файлі.


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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.