¿Cómo arreglar la pantalla blanca al iniciar la aplicación?


111

Tengo una aplicación para Android que muestra una pantalla en blanco durante 2 segundos al iniciar. Mis otras aplicaciones no hacen esto, pero esta sí. También he implementado una pantalla de bienvenida con la esperanza de que solucione este problema. ¿Debo aumentar el tiempo de suspensión de mi pantalla de bienvenida? Gracias.


1
La actividad que está iniciando está tardando demasiado en hacer su onCreateparte. Intente simplemente "setContentView" en esa actividad y verifique si este retraso ha desaparecido.
Sherif elKhatib

1
lo siento, soy un novato y no tengo experiencia con java, ¿puede explicarlo claramente? y, por favor, dé una "respuesta" para que pueda marcarla :)
Anónimo

1
¿Está usando java o c # en su proyecto?
Sherif elKhatib


Respuestas:


104

Solo mencione el tema transparente a la actividad inicial en el archivo AndroidManifest.xml.

Me gusta:

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

y extender esa pantalla con Activityclase en lugar deAppCompatActivity .

me gusta :

public class SplashScreenActivity extends Activity{

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

4
pero el uso final ActionBar actionBar = getActionBar();devolverá nulo cuando el tema sea translúcido
alguien en algún lugar

16
Pankaj: sí, me enteré de que la mala experiencia de la interfaz de usuario se debió a la ventana de "vista previa" ... aparentemente, alguien en Google decidió que una ventana de vista previa blanca era realmente increíble de usar de forma predeterminada. Sin embargo, en una aplicación que usa un fondo oscuro, es una muy mala idea. La solución es crear un estilo personalizado para su aplicación y especificar 'android: windowBackground' en el color que desea usar. Consulte la sección "la ventana de vista previa perfecta" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Someone Somewhere

2
@Hagai L Me ha dado un error como "java.lang.IllegalStateException: necesitas usar un tema Theme.AppCompat (o descendiente) con esta actividad".
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" no funcionó para mí, ¿alguna sugerencia?
jay

1
@TejaDroid para obtener el error de detención "java.lang.IllegalStateException" tienes que extender tu Actividad por android.app.Activity, ahora mismo estás usando AppCompactActivity. Entonces, para AppCompactActivity, no puede usar temas normales.
Listo para Android el

167

Pon esto en un estilo personalizado y resolverá todos los problemas. El uso de la solución translúcida hacky hará que la barra de tareas y la barra de navegación sean translúcidas y que la pantalla de bienvenida o la pantalla principal parezcan espaguetis.

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


3
Gracias, hombre, salvado de muchos problemas. Al principio estaba teniendo dificultades para conseguir el punto de ajuste. Será el bloque de tema principal: inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` debe ser el punto de entrada en el estilo principal .xml
HumaN

2
¡Gracias! Colóquelo en style.xml en la carpeta res en la etiqueta de estilo name = "AppTheme" (o qué tema usa en el manifiesto)
Dimmduh

Trabajó para mi. Gracias.
user1510006

Creo que debería ser una respuesta aceptada, porque muchos desarrolladores usan temas personalizados
Sviatoslav Zaitsev

super útil :)
jasan

74

ingrese la descripción de la imagen aquí

Como en el tubo ... inicialmente muestran una pantalla de iconos en lugar de una pantalla blanca. Y después de 2 segundos muestra la pantalla de inicio.

primero cree un dibujable XML en 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>

A continuación, establecerá esto como fondo de su actividad de bienvenida en el tema. Navegue a su archivo styles.xml y agregue un nuevo tema para su actividad de bienvenida

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

En su nuevo SplashTheme, establezca el atributo de fondo de la ventana en su elemento de diseño XML. Configure esto como el tema de su actividad de bienvenida en su 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>

Este enlace da lo que quieres. procedimiento paso a paso. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

ACTUALIZAR:

El layer-listpuede ser aún más simple como este (que también acepta elementos de diseño vectoriales para el logotipo centrado, a diferencia de la <bitmap>etiqueta):

<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
Esto es realmente genial, pero ¿cómo puedo agregar texto debajo demipmap/ic_launcher
Hasan A Yousef

6
Esta es la mejor respuesta. La razón es que cuando se utilizan las soluciones anteriores, hay un retraso en el inicio visual de la aplicación.
Jr.

una solución más para controlar el mapa de bits stackoverflow.com/questions/23079355/…
amorenew

1
Esta debería ser la respuesta aceptada, todas las demás solo hacen que parezca que la aplicación nunca se inició desde el punto de vista del usuario. Un dibujo más simple layer-listpuede ser este: <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

Esta solución no resuelve el problema cuando queremos cambiar el color de fondo en la lista de capas mediante programación (en su ejemplo, de gris, por ejemplo, a azul). En este escenario, la primera pantalla gris aparece durante uno o dos segundos, luego se establece el fondo azul.
Mohammad Afrashteh

71

Crea un estilo en tu style.xml de la siguiente manera:

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

y utilícelo con su actividad en AndroidManifest como:

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

8

Deberías leer esta gran publicación de Cyril Mottier: El lanzamiento de la aplicación de Android es magnífico

Necesita personalizar su Themein style.xml y evitar personalizar en suonCreate como ActionBar.setIcon / setTitle / etc.

Consulte también la documentación sobre consejos de rendimiento de Google.

Use Trace Viewy Hierarchy Viewerpara ver el tiempo para mostrar sus Vistas: Optimización del rendimiento de Android / Ajuste del rendimiento en Android

Úselo AsyncTaskpara mostrar algunas vistas.


6

Este es mi AppTheme en una aplicación de ejemplo:

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

Como puede ver, tengo los colores predeterminados y luego agregué android:windowIsTranslucenty lo configuré en true.

Hasta donde yo sé como desarrollador de Android, esto es lo único que necesita configurar para ocultar la pantalla blanca al inicio de la aplicación.


4

Ambas obras de propiedades utilizan cualquiera de ellas.

    <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 respuesta de user543 es perfecta

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

Pero:

¡ Su actividad de LAUNCHER debe extenderse Activity , no AppCompatActivity como venía por defecto!


Probé esta solución muchas veces ya que en todas partes escribí esta misma solución, no pudo funcionar -> pero tu PERO me ahorras tiempo, mi actividad extiende AppCompatActivity, es por eso que no funciona, la cambié a actividad ahora funciona, ¡gracias hombre!
Rucha Bhatt Joshi

4

El fondo blanco proviene del tema de la aplicación. Puede mostrar algo útil como el logotipo de su aplicación en lugar de la pantalla blanca. Se puede hacer usando un tema personalizado. En su aplicación Tema simplemente agregue

android:windowBackground=""

atributo. El valor del atributo puede ser una imagen o una lista en capas o cualquier color.


Esto funciona, mejor si configura el color transparente para la ventana. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

Esta debería ser la respuesta aceptada. De todos modos, ¿sabes cómo agregar la animación de escala como la aplicación de youtube?
pratham kesarkar

En lugar de blanco ahora es negro.
Ümañg ßürmån

2

A continuación se muestra el enlace que sugiere cómo diseñar la pantalla de bienvenida. Para evitar el fondo blanco / negro, necesitamos definir un tema con fondo de bienvenida y configurar ese tema para que salpique en el archivo de manifiesto.

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

splash_background.xml dentro de la carpeta 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>

Agregar los siguientes estilos

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

En el tema del conjunto manifiesto como se muestra a continuación

<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

También tuve el mismo problema en uno de mis proyectos. Lo resolví agregando algunos de los siguientes parámetros en el tema proporcionado a la pantalla de inicio.

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

Puede encontrar la razón y la resolución en esta publicación de blog escrita por mí. Espero eso ayude.


Agregue los detalles directamente a su respuesta. Los enlaces pueden volverse inválidos, por eso nos gusta que la respuesta contenga el contenido real, siendo el enlace solo complementario.
OOBalance

1

Se puede solucionar configurando el tema en su manifiesto como

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

y después de eso, si obtiene
java.lang.IllegalStateException: debe usar un tema Theme.AppCompat (o descendiente) con esta actividad.
entonces es posible que deba extender Activity en lugar de AppCompatActivity en su MySplashActivity.

¡Espero eso ayude!


1

El fondo blanco se debe a que Android se inicia mientras la aplicación se carga en la memoria, y puede evitarse si solo agrega esta 2 línea de código en SplashTheme.

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

0

debe deshabilitar la configuración de estudio de Android Instant Run.

Archivo> Configuración> Compilación, Ejecución, Implementación> Ejecución instantánea desmarque todas las opciones que se muestran allí.

Nota: El problema de pantalla blanca debido a Instant Run es solo para compilaciones de depuración, este problema no aparecerá en compilaciones de lanzamiento.


0

Prueba el siguiente código:

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

Este código funciona para mí y funcionará en todos los dispositivos Android.


Se desaconsejan las respuestas de solo código. Haga clic en editar y agregue algunas palabras que resuman cómo su código aborda la pregunta, o quizás explique en qué se diferencia su respuesta de la respuesta / respuestas anteriores. De la opinión
Nick

0

¡Su solución es muy sencilla!

Hay tres razones básicas para este problema

  1. Está realizando una tarea pesada / larga / compleja en la función onCreateVeiw.
  2. Si está utilizando Thread. Entonces, el tiempo de inactividad del hilo puede ser muy largo .
  3. Si está utilizando una biblioteca de terceros . Que se inicializa en el momento de inicio de la aplicación puede generar este problema.

Soluciones:

Solución 1:

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

Solución 2:

  Reduce the Thread Sleep time.

Solución 3:

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

En mi caso, estoy usando Sugar ORM que genera este problema.

Comparte para mejorar.


0

Esto resolvió el problema:

Edite su archivo styles.xml:


Pega el código a continuación:

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

Y no olvide realizar las modificaciones en el archivo AndroidManifest.xml . ( nombre del tema )

Tenga cuidado con el orden de declaración de las actividades en este archivo.


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.