¿Cómo ocultar la barra de acción antes de crear la actividad y luego volver a mostrarla?

243

Necesito implementar una pantalla de bienvenida en mi aplicación de nido de abeja. Uso este código en onCreate de la actividad para mostrar splash:

setContentView(R.layout.splash);
getActionBar().hide();

y este código para mostrar la interfaz de usuario principal después de algún tiempo:

setContentView(R.layout.main);
getActionBar().show();

Pero antes de que se llame a onCreate y aparezca la presentación, hay una pequeña cantidad de tiempo cuando se muestra la barra de acción.

¿Cómo puedo hacer invisible la barra de acción?

Traté de aplicar el tema a la actividad sin barra de acción:

<item name="android:windowActionBar">false</item>

pero en ese caso getActionBar () siempre devuelve nulo y no encontré ninguna forma de mostrarlo nuevamente.

Ilya Izhovkin
fuente
Para Theme.AppCompat.Light... use esto Cómo responder [1] [1]: stackoverflow.com/a/25365193/1364896
Sami Eltamawy

Respuestas:

335

La configuración android:windowActionBar="false"realmente deshabilita la barra de acciones pero luego, como usted dice, getActionBar();devuelve nulo. Esto se resuelve mediante:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    getActionBar().hide();

    setContentView(R.layout.splash); // be sure you call this AFTER requestFeature

Esto crea la ActionBar e inmediatamente la oculta antes de que tenga la oportunidad de mostrarse.

Pero ahora hay otro problema. Después de poner windowActionBar="false"el tema, la Actividad dibuja su Título de ventana normal en lugar de una Barra de acciones.
Si tratamos de evitar esto usando algunos de los *.NoTitleBartemas comunes o si tratamos de poner <item name="android:windowNoTitle">true</item>nuestro propio tema, no funcionará.
La razón es que ActionBar depende del título de la ventana para mostrarse, es decir, ActionBar es un título de ventana transformado.
Entonces, el truco que puede ayudarnos es agregar una cosa más a nuestro tema de actividad xml:

<item name="android:windowActionBar">false</item>
<item name="android:windowTitleSize">0dp</item>

Esto hará que el título de la ventana tenga altura cero, por lo tanto prácticamente invisible.

En su caso, una vez que haya terminado de mostrar la pantalla de inicio, simplemente puede llamar

setContentView(R.layout.main);
getActionBar().show();

y listo La actividad comenzará sin parpadeo de ActionBar, ni se mostrará el título de la ventana.

ADDON: Si muestra y oculta la barra de acciones varias veces, tal vez haya notado que la primera muestra no está animada. A partir de entonces, mostrar y esconderse son animados. Si quieres tener animación en la primera presentación también puedes usar esto:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    // delaying the hiding of the ActionBar
    Handler h = new Handler();
    h.post(new Runnable() {     
        @Override
        public void run() {
            getActionBar().hide();
        }
    });

Lo mismo se puede lograr con:

protected void onPostResume() {
    super.onPostResume();
    getActionBar().hide();

pero puede necesitar lógica adicional para verificar si esta es la primera muestra de la Actividad.

La idea es retrasar un poco la ocultación de ActionBar. En cierto modo, dejamos que se muestre la Barra de acciones, pero luego la ocultamos de inmediato. Por lo tanto, vamos más allá de la primera presentación no animada y la siguiente muestra se considerará segunda, por lo tanto, será animada.

Como habrás adivinado, existe la posibilidad de que la ActionBar pueda verse antes de que la operación retrasada la haya ocultado. Este es realmente el caso. La mayoría de las veces no se ve nada pero, de vez en cuando, puedes ver el parpadeo de ActionBar por una fracción de segundo.

En cualquier caso, esta no es una solución bonita, por lo que agradezco cualquier sugerencia.

Además para el usuario v7 support actionbar, el código será:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
Clérigo
fuente
2
@newton_guima sí, funciona. Solo recuerde usar supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
scana
@Cleric - ¿Cómo haces que todo esto funcione setTheme? Debido a que su respuesta funciona muy bien si configuro el tema desde el Manifiesto, pero si lo hago onCreate(en mi caso, el tema depende de una preferencia por el tema claro de oscuro), la barra de acción holo predeterminada parpadea antes que la que configuré en mi tema de todas formas. Pero tal vez esto valga otra pregunta SO completa.
dentex
2
@Cleric Gracias. Resolví la configuración de mi problema android:theme="@android:style/Theme.NoTitleBar"en el Manifiesto y luego setTheme(R.style.MyTheme)en la actividad principal onCreate; Esto asegura (en Android 4+) evitar el flash del holo predeterminado ActionBarantes del que definí en mi tema (llegué aquí buscando una manera de solucionar esto; en realidad no necesito ninguna pantalla de bienvenida).
dentex
2
Llamo getSupportActionBar().hide();después getWindow().requestFeature(Window.FEATURE_ACTION_BAR);y todo explota con un NPE. ¿Algunas ideas? Problema con Theme.AppCompat?
loeschg
1
@loeschg: tuve el mismo problema y encontré esta solución: stackoverflow.com/a/20315456/3514976
nonzaprej
50

Usando este código simple en su archivo .class para ocultar la barra de acción

getSupportActionBar().hide();
gaurav
fuente
37

Si está utilizando ActionBarSherlock, use Theme.Sherlock.NoActionBar Theme en su Actividad

<activity 
    android:name=".SplashScreenActivity"
    android:theme="@style/Theme.Sherlock.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
kaubatak
fuente
1
Lo mismo se aplica para el estándar de Android 3+ Barra de acciones (sin Sherlock): <activity android:theme="@android:style/Theme.NoActionBar">.
Alex Semeniuk
Solución perfecta :) Gracias.
alicanbatur
77
No veo cómo esta es una respuesta a la pregunta de Ilya. Establecer el tema para ser Theme.Sherlock.NoActionBarsignificará llamar getActionBar()o getSupportActionBar()(para mostrar posteriormente la barra de acción) devuelve nulo ...
Adil Hussain
@AlexSemeniuk Cuando uso esa línea en el manifiesto, error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
aparece
1
@ SiKni8 ¿Está seguro de que está utilizando la biblioteca API13 + para su aplicación?
Alex Semeniuk
19

Crea dos estilos:

<style name="AppThemeNoBar" parent="Theme.AppCompat.Light">
     <item name="android:windowNoTitle">true</item>
</style>

<style name="AppThemeBar" parent="Theme.AppCompat.Light">
    <item name="android:windowNoTitle">false</item>
</style>

Establezca AppThemeNoBar como tema de la aplicación y AppThemeBar en la actividad donde desea mostrar la Barra de acciones. Usando dos estilos, no verá la barra de Acción mientras se cargan las vistas.

Comprueba este enlace Android: oculta la barra de acción mientras visualizas la carga

Laranjeiro
fuente
¡Finalmente! Trabajó para mi. Gracias. :)
Dhofca
Esto no funciona en Android 2.3.3 con AppCompat. Se muestra ActionBar. Sin embargo, esto funciona en ie KitKat.
Yar
17

Hola, tengo una solución simple usando 2 temas

  1. Tema de la pantalla de bienvenida (agréguelo al manifiesto):

    <style name="SplashTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowBackground">@color/red</item> </style>

  2. tema normal (agréguelo en su actividad mediante setTheme (R.style.Theme)):

    <style name="Theme" parent="@style/Theme.Holo"> <item name="android:windowBackground">@color/blue</item> </style>

Para admitir SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

    setTheme(R.style.Theme);      
    super.onCreate(savedInstanceState);

      ...........
      ...........
}
Abdullah
fuente
15

También estaba tratando de ocultar Action Bar en Android 2.2, pero ninguna de estas soluciones funcionó. Todo termina con un choque. Revisé el registro de DDMS, me decía que usara 'Theme.AppCompat'. Finalmente resolví el problema cambiando la android:theme="@android:style/Theme.Holo.Light.NoActionBar"línea

dentro android:theme="@style/Theme.AppCompat.NoActionBar"y funcionó, pero la interfaz estaba oscura.

Luego intenté android:theme="@style/Theme.AppCompat.Light.NoActionBar"y finalmente obtuve lo que quería.

Después de eso, cuando busqué sobre 'AppCompat' en el sitio del desarrollador, obtuve esto.

Así que creo que la solución para Android 2.2 es

<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Y perdón por mi mal inglés como siempre.

S.Ahsan
fuente
12

El mejor resultado para mí fue crear una actividad con ThemeNoTitleBar y sin contenido como lanzador. Entonces esta actividad llama directamente a la otra.

Por supuesto, si lo desea, puede agregar contenido a la Actividad Splash, pero en mi caso solo quería mostrar la aplicación directamente.

Manifiesto:

<activity
        android:name="com.package.SplashActivity"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Actividad:

public class SplashActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    //start StartActivity
    Intent intent = new Intent(this, StartActivity.class);
    startActivity(intent);
    finish();
}

}

javak
fuente
9

Si usa uno Activityincluido una pantalla de bienvenida, puede hacerlo si usaSherlockActionBar

getSupportActionBar().hide();

Después de la pantalla de bienvenida, puede volver a mostrarla con ...

getSupportActionBar().show();

Debería ser lo mismo con nativo ActionBarde Android.

Luser_k
fuente
6

La solución @Clerics funciona. Pero esto también parece ser un problema con algunas de las aplicaciones nativas de Google: Google, Play Store, Talk. También otras grandes aplicaciones como Skype.

EDITAR : la solución de abajo me ha dado un problema para actionbarsherlock en api <4.0, la razón se establece El tema no funciona pre sandwich de helado

Agregue lo siguiente en su manifiesto dentro de su aplicación o etiquetas de actividad:

android:theme="@style/Theme.NoActionBar"

Y luego en su actividad principal:

    // Set theme
    setTheme(R.style.YOUR_THEME);
    getSupportActionBar().setTitle(R.string.title);

    // Start regular onCreate()
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
Warpzit
fuente
6

mejor y simple

requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

arslan haktic
fuente
6

2015, utilizando la biblioteca de soporte v7 con el tema AppCompat, configure este tema para su Actividad.

<style name="AppTheme.AppStyled" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/md_indigo_100</item>
    <item name="colorPrimary">@color/md_indigo_500</item>
    <item name="colorAccent">@color/md_red_500</item>
    <item name="android:textColorPrimary">@color/md_white_1000</item>
    <item name="android:textColor">@color/md_purple_500</item>
    <item name="android:textStyle">bold</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>
Son Nguyen Thanh
fuente
4

Para Splashscreenusted debe usar esta línea manifesty no usargetActionBar()

<item name="android:windowActionBar">false</item>

y una vez cuando Splash Activityhaya terminado en el Activityuso principal a continuación o nada

<item name="android:windowActionBar">true</item>
ingsaurabh
fuente
Esto realmente funciona si usa un tema diferente para la página de bienvenida que la página principal de su aplicación. Simplemente use android: theme = "@ style / mytheme" tanto para la Actividad principal (su pantalla de inicio) como para la primera actividad de su aplicación que no sea el intercambio de temas de la pantalla de inicio.
ThanksMister, el
1
Esto genera un error en los niveles actuales de la API: "Al atributo le falta el prefijo del espacio de nombres de Android". <item android:name="android:windowActionBar">true</item>se deshace de este error, pero no sé si aún funciona.
LarsH
3

Prueba esto, funciona para mí:

A continuación se elimina la barra de título de la actividad.

 requestWindowFeature(Window.FEATURE_NO_TITLE);

A continuación, se elimina la barra de notificaciones para que la actividad pase a pantalla completa

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

(Ejemplo completo a continuación) Tome nota: estos métodos se llamaron antes de establecer la vista de contenido de nuestra actividad

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Sets Application to full screen by removing action bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);    
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_main); 

        // without this check, we would create a new fragment at each orientation change!
        if (null == savedInstanceState)
            createFragment();
    }
usuario3862873
fuente
Aclare por qué esto funciona o por qué cree que debería funcionar. Solo pegar el código no es una respuesta completa.
Kris
@Kris, ¡Ya veo lo que quieres decir, gracias!
user3862873
3

esto puede ser útil
agregue esto a su manifiesto

 android:theme="@android:style/Theme.Light.NoTitleBar" 

salud

ralphgabb
fuente
¿Por qué publicar algo no tan bueno como la respuesta principal en una pregunta tan antigua?
gsamaras
la "respuesta principal" no me ayudó, así que me encontré con esta respuesta y la publiqué aquí.
ralphgabb
2

La mejor manera que encuentro después de leer todas las opciones disponibles es establecer el tema principal sin ActionBar y luego configurar MyTheme en el código principal de toda la Actividad.

Manifiesto:

<application
...
        android:theme="@android:style/Theme.Holo.Light.NoActionBar"
...>

Actividad base:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.GreenHoloTheme);
}

¡De esta forma me ayuda a evitar ActionBar cuando se inicia la aplicación!

DmRomantsov
fuente
1

Las soluciones ya publicadas llegaron con el efecto secundario, que la primera llamada .show () no animó la ActionBar para mí. Obtuve otra buena solución, que solucionó eso:

Crea un dibujo transparente, algo así:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
       android:color="#00000000" />
</shape>

Establezca el fondo de la barra de acción real en una vista personalizada invisible que establezca en la barra de acción:

getSupportActionBar().setCustomView(R.layout.actionbar_custom_layout);
      getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
              ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);

Establezca el fondo transparente para la barra de acción en onCreate:

getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_transparent));

Imortant: no oculte la barra de acción inmediatamente en onCreate, pero con un poco de retraso más tarde, por ejemplo, cuando el diseño termina con la creación:

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    getSupportActionBar().hide();
                }
            });

Antes de su primera llamada .show () configure la vista personalizada visible:

_actionbarRoot.setVisibility(View.VISIBLE);
getSupportActionBar().show();
mAx
fuente
1

En caso de que tenga nulo porque está utilizando la biblioteca de soporte , en lugar de getActionBar()necesitar llamar getSupportActionBar().

Naskov
fuente
1

Simplemente agregue esto a su MainActivity en la función onCreate.

val actionBar = supportActionBar?.apply { hide() }
MöritzRo
fuente
Es un trabajo en Androidx. Solo agregue después de setContentView () esta filasupportActionBar?.apply { hide() }
Black_Zerg
0

Coloque su pantalla de presentación en una actividad separada y startActivityForResultúsela del onCreatemétodo de su actividad principal para mostrarla. Esto funciona porque, según los documentos:

Como caso especial, si llama a startActivityForResult () con requestCode> = 0 durante el onCreate inicial (Bundle savedInstanceState) / onResume () de su actividad, su ventana no se mostrará hasta que se devuelva un resultado de la actividad iniciada . Esto es para evitar parpadeos visibles al redirigir a otra actividad.

Probablemente debería hacer esto solo si el argumento onCreatees null(indicando un nuevo lanzamiento de su actividad, en lugar de un reinicio debido a un cambio de configuración).

Ted Hopp
fuente
Esto no funciona. Cuando se inicia onCreate (), la barra de acción ya está visible. Esto se ve claramente en la depuración.
Ilya Izhovkin
0

Todavía tenía un error con el puntero nulo y finalmente ayudó cuando llamé primero a getWindow (). RequestFeature () y luego a super.onCreate ()

public void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
getActionBar().show();
Matwosk
fuente
0

Simplemente agregue esto en su styles.xml

<item name="android:windowNoTitle">true</item>
Jakub Trzcinka
fuente
0

En realidad, puedes simplemente configurar splash Activitycon NoActionBar tu activitybarra de acción y configurar tu main .

Chauyan
fuente
0

La mejor manera de hacerlo es hacer la primera actividad como actividad en blanco y el contenido que desea poner y luego, después de un tiempo, activar otra actividad. Siguiendo de esta manera, puede realizar la primera actividad como pantalla de inicio sin barra de acción ni nada. Heres mi primera actividad

package com.superoriginal.rootashadnasim.syllabus;

import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class first_screen extends AppCompatActivity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first_screen);


    final Handler h=new Handler();
    h.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent=new     Intent(getApplicationContext(),DrawerChooseBranchMainActivity.class);
            startActivity(intent);
        }
    },2000);

}
}

Después de eso, puede poner cualquiera de sus actividades como primera actividad. Si no desea una barra de acción en ninguna pantalla, simplemente agregue esto en sus estilos

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
ashad
fuente
0

Android Studio proporciona una plantilla de compilación para pantalla completa, si usa Android Studio puede seguir el siguiente paso para implementar la actividad de pantalla completa.

Primer paso para crear una nueva actividad

Seleccionar seleccionar Actividad en pantalla completa

Hecho. Android Studio hizo su trabajo, ahora puede verificar el código para pantalla completa.

Hitesh Dhamshaniya
fuente
-1

esta es la mejor forma en que utilicé Ir al archivo java, después de onCreate:

@Override
    protected void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        // Take instance of Action Bar 
        // using getSupportActionBar and 
        // if it is not Null 
        // then call hide function 
        if (getSupportActionBar() != null) { 
            getSupportActionBar().hide(); 
        } 
    }
DJEMAL Mohamed
fuente
-3

Me doy cuenta de que publicar enlaces no es la mejor manera de hacer las cosas, pero le recomiendo que lea la siguiente documentación de Google. Este es el documento oficial de Android sobre cómo controlar la interfaz de usuario del sistema (cosas como la barra de acción, la barra de navegación, etc.). Desafortunadamente, la información es demasiado para publicar directamente, pero después de leer esto, comprenderá exactamente cómo mostrar y ocultar características, sin importar la versión que esté desarrollando, ¡es tan simple!

En caso de que el enlace cambie, se puede encontrar en la documentación oficial de Android en capacitación -> iniciación -> Mejores prácticas para la interfaz de usuario -> administrar la interfaz de usuario del sistema

https://developer.android.com/training/system-ui/index.html

ingrese la descripción de la imagen aquí

Chris
fuente
-4

puedes usar esto:

getSupportActionBar().hide(); si no funciona, prueba este:

getActionBar().hide();

si lo anterior no funciona, intente así:

en su directorio = res / values ​​/ style.xml, abra style.xml -> hay un parentcambio de atributo enparent="Theme.AppCompat.Light.DarkActionBar"

si todo eso no funciona también. Ya no lo se. Pero para mí funciona.

Sen
fuente
getSupportActionBar (). hide (); fue mencionado en la respuesta más votada, getActionBar (). hide (); fue mencionado en la pregunta, y DarkActionBar fue mencionado en la respuesta de Son Nguyen Thanh. Además, esta pregunta tiene 4 años y ya tiene varias respuestas altamente votadas.
augray