Как исправить белый экран при запуске приложения?


111

У меня есть приложение для Android, которое при запуске отображает белый экран в течение 2 секунд. Другие мои приложения этого не делают, а вот это. Я также реализовал заставку в надежде, что это исправит. Следует ли мне увеличить время ожидания экрана-заставки? Спасибо.


1
Занятие, которое вы начинаете, занимает слишком много времени, чтобы сделать свое дело onCreate. Попробуйте просто "setContentView" в этом действии и проверьте, исчезла ли эта задержка.
Sherif elKhatib

1
извините, я новичок, и у меня нет опыта работы с java, не могли бы вы четко объяснить? и, пожалуйста, дайте «ответ», чтобы я мог поставить галочку :)
Anonymous

1
Используете ли вы в своем проекте Java или C # ?
Sherif elKhatib

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();вернет null, когда Тема полупрозрачна
Someone Somewhere

17
Панкадж - да, я узнал, что плохой интерфейс был из-за окна "предварительного просмотра" ... очевидно, кто-то в Google решил, что белое окно предварительного просмотра действительно здорово использовать по умолчанию. Однако в приложении, использующем темный фон, это действительно плохая идея. Решение состоит в том, чтобы создать собственный стиль для вашего приложения и указать в android: windowBackground цвет, который вы хотите использовать. См. Раздел «идеальное окно предварительного просмотра» cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Someone Somewhere

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
Спасибо, мужик, избавлен от лишних хлопот. Поначалу у меня были проблемы с установкой точки. Это будет основной блок темы: встроенный `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` должен быть точкой входа в основном стиле .xml
HumaN

2
Спасибо! Поместите его в style.xml в папку res в style tag name = "AppTheme" (или какую тему вы используете в манифесте)
Dimmduh

Работал у меня. Спасибо.
user1510006

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

супер полезно :)
jasan

75

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

Как вы трубка .. изначально они показывают экран значков вместо белого экрана. И через 2 секунды показывает домашний экран.

сначала создайте XML-файл в 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>

Затем вы установите это в качестве фона для вашей заставки в теме. Перейдите в свой файл 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
Хасан А Юсеф

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>
Франко

Это решение не решает проблему, когда мы хотим программно изменить цвет фона в списке слоев (в вашем примере с серого, например, на синий). В этом случае сначала на секунду или две появляется серый экран, затем устанавливается синий фон!
Mohammad Afrashteh

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файле as ActionBar.setIcon / setTitle / etc.

См. Также документацию по советам по производительности от 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>

Но:

Ваша активность LAUNCHER должна расширять Activity , а не AppCompatActivity, как это было по умолчанию!


Я пробовал это решение много раз, поскольку везде писали это же решение, оно не могло работать -> но ваше НО экономит мое время, моя Activity расширяет AppCompatActivity, поэтому он не работает, я изменил его на Activity, теперь он работает, спасибо, чувак !!
Rucha Bhatt Joshi

4

Белый фон поступает из Apptheme. Вы можете показать что-то полезное, например, логотип вашего приложения, вместо белого экрана. Это можно сделать с помощью настраиваемой темы. В вашем приложении Theme просто добавьте

android:windowBackground=""

атрибут. Значение атрибута может быть изображением, многоуровневым списком или любым цветом.


Это работает, лучше, если вы установите прозрачный цвет для окна. <item name="android:windowBackground">@android:color/transparent</item>
Амол Десаи

Это должен быть принятый ответ. В любом случае вы знаете, как добавить анимацию масштабирования, как приложение YouTube.
пратхам кесаркар

Вместо белого теперь черный.
Ümañg ßürmån

2

Ниже приведена ссылка, по которой предлагается, как создать экран-заставку. Чтобы избежать белого / черного фона, нам нужно определить тему с фоном всплеска и установить эту тему для всплеска в файле манифеста.

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

splash_background.xml внутри папки 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>

Добавить стили ниже

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

В манифесте установите тему, как показано ниже

<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 (или ее потомок) с этим действием.
тогда вам может потребоваться расширить Activity вместо AppCompatActivity в вашем MySplashActivity.

Надеюсь, поможет!


1

Белый фон возникает из-за того, что Android запускается, когда приложение загружается в память, и этого можно избежать, если вы просто добавите эти две строки кода в SplashTheme.

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

0

вам следует отключить Instant Run Android Studio Settings.

Файл> Настройки> Сборка, Выполнение, Развертывание> Мгновенный запуск. Снимите отметку со всех показанных там параметров.

Примечание. Проблема с белым экраном из-за мгновенного запуска относится только к сборкам отладки, эта проблема не будет отображаться в сборках выпуска.


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.


Ответы только на код не приветствуются. Нажмите « Изменить» и добавьте несколько слов, описывающих, как ваш код решает вопрос, или, возможно, объясните, чем ваш ответ отличается от предыдущего ответа / ответов. Из
Nick

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.

В моем случае я использую Sugar 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.