Como corrigir a tela branca na inicialização do aplicativo?


111

Tenho um aplicativo para Android que exibe uma tela branca por 2 segundos na inicialização. Meus outros aplicativos não fazem isso, mas este faz. Eu também implementei uma tela inicial com a esperança de corrigir isso. Devo aumentar o tempo de suspensão da tela inicial? Obrigado.


1
A atividade que você está iniciando está demorando muito para fazer sua onCreateparte. Tente apenas "setContentView" nessa atividade e verifique se o atraso acabou.
Sherif elKhatib

1
desculpe, eu sou um novato e não tenho experiência com java, você pode explicar claramente? e por favor dê uma "resposta" para que eu possa assinalá-la :)
Anônimo

1
Você está usando java ou c # em seu projeto?
Sherif elKhatib


Respostas:


104

Basta mencionar o tema transparente para a atividade inicial no arquivo AndroidManifest.xml.

Gostar:

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

e estenda essa tela com Activityclasse no lugar de AppCompatActivity.

gostar :

public class SplashScreenActivity extends Activity{

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

4
mas usar final ActionBar actionBar = getActionBar();retornará nulo quando o tema for translúcido
Alguém em algum lugar

17
Pankaj - sim, eu aprendi que a experiência ruim da interface do usuário era devido à janela de "visualização" ... aparentemente alguém no Google decidiu que uma janela de visualização branca era realmente incrível de usar por padrão. No entanto, em um aplicativo que usa um fundo escuro, é uma péssima ideia. A solução é criar um estilo personalizado para seu aplicativo e especificar 'android: windowBackground' para a cor que deseja usar. Consulte a seção "a janela de visualização perfeita" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Alguém em algum lugar

2
@Hagai L Me deu um erro como "java.lang.IllegalStateException: Você precisa usar um tema Theme.AppCompat (ou descendente) com esta atividade."
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" não funcionou para mim, alguma sugestão?
Jay

1
@TejaDroid para obter o erro de parada "java.lang.IllegalStateException", você deve estender sua atividade por android.app.Activity, agora você está usando AppCompactActivity. Portanto, para AppCompactActivity você não pode usar temas normais.
Pronto para Android de

167

Coloque isso em um estilo personalizado e resolverá todos os problemas. Usar a correção translúcida do hacky tornará sua barra de tarefas e barra de navegação translúcidas e fará com que a tela inicial ou a tela principal pareçam espaguete.

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


3
Homem de Thx, salvo de muitos aborrecimentos. Eu estava tendo dificuldade inicialmente para chegar ao ponto de ajuste. Será o bloco de tema principal: inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` deve ser o ponto de entrada no estilo principal .xml
HumaN

2
THX! Coloque-o em style.xml na pasta res em style tag name = "AppTheme" (ou o tema que você usa no manifesto)
Dimmduh

Funcionou para mim. Obrigado.
user1510006

Acho que deve ser aceita a resposta, porque muitos desenvolvedores usam temas personalizados
Sviatoslav Zaitsev

super útil :)
jasan

74

insira a descrição da imagem aqui

Como o you tube ... inicialmente eles mostram a tela de ícones em vez da tela branca. E depois de 2 segundos mostra a tela inicial.

primeiro crie um drawable XML em 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 seguir, você definirá isso como o plano de fundo da sua atividade inicial no tema. Navegue até seu arquivo styles.xml e adicione um novo tema para sua atividade inicial

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

Em seu novo SplashTheme, defina o atributo de fundo da janela para seu drawable XML. Configure isso como o tema da sua atividade inicial em seu 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 link dá o que você deseja. procedimento passo a passo. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

ATUALIZAR:

O layer-listpode ser ainda mais simples assim (que também aceita drawables vetoriais para o logotipo centralizado, ao contrário da <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
Isso é muito bom, mas como posso adicionar texto sob omipmap/ic_launcher
Hasan A Yousef

6
Esta é a melhor resposta. A razão é que ao usar as soluções acima, há um atraso na inicialização visual do aplicativo.
Jnr

mais uma correção para controlar o bitmap stackoverflow.com/questions/23079355/…
amorenew

1
Esta deve ser a resposta aceita, todas as outras apenas fazem parecer que o aplicativo nunca foi iniciado do ponto de vista do usuário. Um drawable mais simples layer-listpode 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 solução não resolve o problema quando queremos mudar a cor de fundo na lista de camadas programaticamente (em seu exemplo de cinza, por exemplo, para azul). Nesse cenário, a primeira tela cinza aparece por um ou dois segundos, depois o fundo azul é definido!
Mohammad Afrashteh

71

Faça um estilo em seu style.xml da seguinte maneira:

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

e use-o com sua atividade no AndroidManifest como:

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

8

Você deveria ler este excelente post de Cyril Mottier: Lançamento de aplicativo Android tornado maravilhoso

Você precisa personalizar seu Themeem style.xml e evitar personalizá-lo em onCreateActionBar.setIcon / setTitle / etc.

Consulte também a documentação sobre dicas de desempenho do Google.

Use Trace Viewe Hierarchy Viewerpara ver o tempo para exibir suas visualizações: Otimização de desempenho do Android / Ajuste de desempenho no Android

Use AsyncTaskpara exibir algumas visualizações.


6

Este é meu AppTheme em um aplicativo de exemplo:

<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 você pode ver, eu tenho as cores padrão, adicionei android:windowIsTranslucente defini como true.

Pelo que eu sei como desenvolvedor Android, essa é a única coisa que você precisa definir para ocultar a tela branca no início do aplicativo.


4

Os trabalhos de ambas as propriedades usam qualquer um deles.

    <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

A resposta do usuário543 é perfeita

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

Mas:

Sua atividade LAUNCHER deve estender Activity , não AppCompatActivity como vinha por padrão!


Eu tentei essa solução muitas vezes, pois em todos os lugares escrevi essa mesma solução, não poderia funcionar -> mas seu MAS economize meu tempo minha atividade estende AppCompatActivity é por isso que não está funcionando mudei para atividade agora funciona obrigado cara !!
Rucha Bhatt Joshi

4

O fundo branco vem do Apptheme. Você pode mostrar algo útil como o logotipo do seu aplicativo em vez da tela branca. Isso pode ser feito usando o tema personalizado. No seu aplicativo, basta adicionar Tema

android:windowBackground=""

atributo. O valor do atributo pode ser uma imagem ou lista em camadas ou qualquer cor.


Isso funciona, melhor se você definir a cor transparente para a janela. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

Esta deve ser a resposta aceita. De qualquer forma você sabe como adicionar a animação de dimensionamento como o app do youtube.
pratham kesarkar

Em vez de branco agora é preto.
Ümañg ßürmån

2

Abaixo está o link que sugere como projetar a tela inicial. Para evitar o fundo branco / preto, precisamos definir um tema com fundo inicial e definir esse tema para o arquivo manifesto.

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

splash_background.xml dentro da pasta 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>

Adicione os estilos abaixo

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

No tema do conjunto de manifesto, conforme mostrado abaixo

<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

Eu também tive o mesmo problema em um de meu projeto. Resolvi isso adicionando alguns parâmetros a seguir no tema fornecido para a tela inicial.

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

Você pode encontrar o motivo e a resolução nesta postagem do blog escrita por mim. Espero que ajude.


Adicione os detalhes diretamente à sua resposta. Os links podem tornar-se inválidos, por isso gostamos que a resposta contenha o conteúdo propriamente dito, sendo o link apenas complementar.
OOBalance

1

Isso pode ser corrigido definindo o tema em seu manifesto 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>

e depois disso, se você estiver obtendo
java.lang.IllegalStateException: Você precisa usar um tema Theme.AppCompat (ou descendente) com esta atividade.
então, pode ser necessário estender Activity em vez de AppCompatActivity em MySplashActivity.

Espero que ajude!


1

O fundo branco é causado porque o Android é iniciado enquanto o aplicativo é carregado na memória e pode ser evitado se você apenas adicionar essas 2 linhas de código em SplashTheme.

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

0

você deve desativar as configurações do Android Studio Instant Run.

Arquivo> Configurações> Compilar, Execução, Implantação> Instant Run desmarque todas as opções mostradas lá.

Nota: O problema de tela branca devido ao Instant Run é apenas para compilações de depuração, este problema não aparecerá em compilações de lançamento.


0

Experimente o seguinte 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 mim e funcionará em todos os dispositivos Android.


Respostas apenas em código são desencorajadas. Clique em editar e adicione algumas palavras resumindo como seu código aborda a questão, ou talvez explique como sua resposta difere da resposta / respostas anteriores. Da avaliação
Nick

0

Sua Solução é Muito Simples!

Existem três razões básicas para este problema

  1. Você está executando uma tarefa pesada / longa / complexa na função onCreateVeiw.
  2. Se você estiver usando Thread. Então, o tempo de suspensão da thread pode ser muito grande.
  3. Se você estiver usando qualquer biblioteca de terceiros . Que é inicializar a aplicação iniciar-se tempo que pode leva este problema.

Soluções:

Solução 1:

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

Solução 2:

  Reduce the Thread Sleep time.

Solução 3:

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

No meu caso estou usando Sugar ORM que leva esse problema.

Compartilhe para melhorar.


0

Isso resolveu o problema:

Edite seu arquivo styles.xml:


Cole o código abaixo:

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

E não se esqueça de fazer as modificações no arquivo AndroidManifest.xml . ( nome do tema )

Tenha cuidado com a ordem de declaração das atividades neste arquivo.


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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.