Come nascondere la barra delle azioni prima che l'attività venga creata e mostrarla di nuovo?


243

Devo implementare la schermata iniziale nella mia app a nido d'ape. Uso questo codice in onCreate di attività per mostrare splash:

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

e questo codice per mostrare l'interfaccia utente principale dopo qualche tempo:

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

Ma prima che onCreate venga chiamato e appaia splash, c'è poco tempo quando viene mostrata la barra delle azioni.

Come posso rendere invisibile la barra delle azioni?

Ho provato ad applicare il tema all'attività senza barra delle azioni:

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

ma in quel caso getActionBar () restituisce sempre null e non ho trovato alcun modo per mostrarlo di nuovo.


Per Theme.AppCompat.Light... utilizzare questo come rispondere [1] [1]: stackoverflow.com/a/25365193/1364896
Sami Eltamawy

Risposte:


335

L'impostazione android:windowActionBar="false"disabilita veramente ActionBar ma poi, come dici tu, getActionBar();restituisce null. Questo è risolto da:

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

Questo crea l'ActionBar e lo nasconde immediatamente prima che potesse essere visualizzato.

Ma ora c'è un altro problema. Dopo aver windowActionBar="false"inserito il tema, l'attività disegna il suo normale titolo della finestra anziché una barra delle azioni.
Se proviamo a evitarlo utilizzando alcuni dei *.NoTitleBartemi di borsa o proviamo a inserire il <item name="android:windowNoTitle">true</item>nostro tema, non funzionerà.
Il motivo è che ActionBar dipende dal titolo della finestra per visualizzarsi, ovvero ActionBar è un titolo della finestra trasformato.
Quindi il trucco che ci può aiutare è aggiungere un'altra cosa al nostro tema XML di attività:

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

Ciò renderà il titolo della finestra con altezza zero, quindi praticamente invisibile.

Nel tuo caso, dopo aver finito di visualizzare la schermata iniziale puoi semplicemente chiamare

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

e il gioco è fatto. L'attività inizierà senza sfarfallio di ActionBar, né con il titolo della finestra visualizzato.

ADDON: Se mostri e nascondi ActionBar più volte, potresti aver notato che il primo show non è animato. Da quel momento in poi mostrare e nascondere sono animati. Se vuoi avere anche l'animazione al primo spettacolo puoi usare questo:

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();
        }
    });

La stessa cosa si può ottenere con:

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

ma potrebbe essere necessario un po 'di logica in più per verificare se questa è la prima rappresentazione dell'Attività.

L'idea è di ritardare un po 'il nascondiglio di ActionBar. In un certo senso lasciamo che ActionBar venga mostrato, ma poi lo nascondiamo immediatamente. Quindi andiamo oltre il primo spettacolo non animato e il prossimo spettacolo sarà considerato secondo, quindi sarà animato.

Come avrai intuito, c'è la possibilità che ActionBar possa farlo essere visto prima che fosse nascosto dall'operazione ritardata. Questo è in realtà il caso. Il più delle volte non si vede nulla ma, ogni tanto, è possibile vedere lo sfarfallio di ActionBar per una frazione di secondo.

In ogni caso questa non è una soluzione carina, quindi accolgo con favore eventuali suggerimenti.

Aggiunta per l'utente della barra delle azioni di supporto v7, il codice sarà:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();

2
@newton_guima sì, funziona. Ricorda solo di utilizzare supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
scana,

@Cleric - Come riesci a far funzionare tutto questo setTheme? Perché la tua risposta funziona benissimo se imposto il tema dal Manifest, ma se lo faccio in onCreate(nel mio caso il tema dipende da una preferenza per il tema chiaro di scuro) la barra di azione holo predefinita lampeggia prima di quella che ho impostato nel mio tema Comunque. Ma forse questo vale un'altra domanda SO completa.
Dentex

2
@Cleric Grazie. Ho risolto la mia impostazione del problema android:theme="@android:style/Theme.NoTitleBar"nel Manifest e poi setTheme(R.style.MyTheme)nelle attività principali onCreate; Ciò garantisce (in Android 4+) di evitare il flash dell'holo predefinito ActionBarprima di quello che ho definito nel mio tema (sono arrivato qui alla ricerca di un modo per aggirare il problema; in realtà non ho bisogno di alcuno splash-screen).
dentex,

2
Chiamo getSupportActionBar().hide();dopo getWindow().requestFeature(Window.FEATURE_ACTION_BAR);e tutto esplode con un NPE. Qualche idea? Problemi con Theme.AppCompat?
loeschg,

1
@loeschg: Ho avuto lo stesso problema e ho trovato questa soluzione: stackoverflow.com/a/20315456/3514976
nonzaprej

50

Usando questo semplice codice nel tuo file .class per nascondere la barra delle azioni

getSupportActionBar().hide();

37

Se si utilizza ActionBarSherlock, utilizzare Theme.Sherlock.NoActionBar Theme nella propria attività

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

1
Lo stesso vale per lo standard Android 3+ ActionBar (senza Sherlock): <activity android:theme="@android:style/Theme.NoActionBar">.
Alex Semeniuk,

Soluzione perfetta :) Grazie.
alicanbatur,

7
Non vedo come questa sia una risposta alla domanda di Ilya. Impostare il tema come Theme.Sherlock.NoActionBarsarà significa chiamare getActionBar()o getSupportActionBar()(per mostrare successivamente la barra delle azioni) restituisce null ...
Adil Hussain

@AlexSemeniuk Quando uso quella riga nel manifest, ottengo questo errore:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
Si8

1
@ SiKni8 Sei sicuro di utilizzare la libreria API13 + per la tua applicazione?
Alex Semeniuk,

19

Crea due stili:

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

Impostare AppThemeNoBar come tema dell'applicazione e AppThemeBar sull'attività in cui si desidera mostrare la ActionBar. Utilizzando due stili non si vedrà la barra delle azioni durante il caricamento delle viste.

Controlla questo collegamento Android: nascondi la barra delle azioni durante la visualizzazione del caricamento


Finalmente! Ha funzionato per me. Grazie. :)
Dhofca,

Questo non funziona su Android 2.3.3 con AppCompat. Viene visualizzato ActionBar. Tuttavia, questo funziona su KitKat.
Anno

17

Ciao ho una soluzione semplice usando 2 temi

  1. Tema della schermata iniziale (aggiungilo al manifest):

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

  2. tema normale (aggiungilo alla tua attività tramite setTheme (R.style.Theme)):

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

Per supportare SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

      ...........
      ...........
}

15

Stavo anche cercando di nascondere la barra delle azioni su Android 2.2, ma nessuna di queste soluzioni ha funzionato. Tutto finisce con un incidente. Ho controllato il DDMS LOg, mi stava dicendo di usare "Theme.AppCompat". Finalmente ho risolto il problema cambiando la android:theme="@android:style/Theme.Holo.Light.NoActionBar"linea

in android:theme="@style/Theme.AppCompat.NoActionBar"e ha funzionato, ma il l'interfaccia era buio.

poi ho provato android:theme="@style/Theme.AppCompat.Light.NoActionBar"e finalmente ho ottenuto quello che volevo.

Dopo ciò, quando ho cercato "AppCompat" sul sito degli sviluppatori, ho ricevuto questo.

Quindi penso che sia la soluzione per Android 2.2

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

E scusami per il mio cattivo inglese come sempre.


12

Il miglior risultato per me è stato creare un'attività con ThemeNoTitleBar e senza contenuto come launcher. Quindi questa attività chiama direttamente l'altra.

Naturalmente, se vuoi, puoi aggiungere contenuti all'attività Splash, ma nel mio caso volevo solo mostrare l'applicazione direttamente.

Manifesto:

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

Attività:

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();
}

}


9

Se ne usi uno Activityincluso in una schermata iniziale, puoi farlo se lo usiSherlockActionBar

getSupportActionBar().hide();

Dopo la schermata iniziale puoi mostrarla di nuovo con ...

getSupportActionBar().show();

Dovrebbe essere lo stesso con nativo ActionBardi Android.


6

La soluzione @Clerics funziona. Ma questo sembra essere anche un problema con alcune app native di Google: Google, Play Store, talk. Anche altre grandi app come skype.

EDIT : La soluzione qui sotto mi ha dato problemi per actionbarsherlock su api <4.0, la ragione per cui è stato impostato Il tema non funziona prima del sandwich al gelato

Aggiungi quanto segue nel manifest all'interno dei tag dell'applicazione o dell'attività:

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

E poi nella tua attività principale:

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

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

6

migliore e semplice

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


6

2015, utilizzando la libreria di supporto v7 con il tema AppCompat, imposta questo tema per la tua attività.

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

4

Perché Splashscreendovresti usare questa linea manifeste non usaregetActionBar()

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

e una volta quando Splash Activityè finito Activitynell'uso principale di seguito o niente

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

Questo in realtà funziona se si utilizza un tema diverso per la pagina iniziale rispetto alla pagina principale dell'applicazione. Usa semplicemente android: theme = "@ style / mytheme" sia per l'attività principale (la tua schermata iniziale) sia per la prima attività dell'applicazione che non è la schermata iniziale che scambia temi.
Grazie,

1
Ciò genera un errore ai livelli API correnti: "Nell'attributo manca il prefisso dello spazio dei nomi Android". <item android:name="android:windowActionBar">true</item>elimina questo errore, ma non so se funziona ancora.
LarsH,

3

Prova questo, funziona per me:

Di seguito elimina la barra del titolo dell'attività

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Di seguito elimina la barra di notifica per rendere l'attività a schermo intero

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

(Esempio completo di seguito) Nota: questi metodi sono stati chiamati prima di impostare la visualizzazione del contenuto della nostra attività

@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();
    }

Chiarisci perché funziona o perché pensi che dovrebbe funzionare. Basta incollare il codice non fornisce una risposta completa.
Kris,

@Kris, oh capisco cosa intendi, grazie!
user3862873

3

può essere utile
aggiungere questo al tuo manifest

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

Saluti


Perché pubblicare qualcosa di non eccezionale come la risposta migliore in una domanda così vecchia?
gsamaras,

la "risposta migliore" non mi ha aiutato, quindi mi sono trovato con questa risposta e l'ho pubblicata qui.
ralphgabb,

2

Il modo migliore che trovo dopo aver letto tutte le opzioni disponibili è impostare il tema principale senza ActionBar e quindi impostare MyTheme nel codice padre di tutte le attività.

Manifesto:

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

BaseActivity:

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

In questo modo mi aiuta a evitare ActionBar all'avvio dell'applicazione!


1

Le soluzioni già pubblicate sono arrivate con il sideffect, che la prima chiamata .show () non ha animato l'ActionBar per me. Ho ottenuto un'altra bella soluzione, che ha risolto che:

Crea un disegno trasparente - qualcosa del genere:

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

Imposta lo sfondo effettivo della barra delle azioni su una vista personalizzata invisibile che hai impostato sulla barra delle azioni:

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

Imposta lo sfondo trasparente per la barra delle azioni in onCreate:

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

Importante: non nascondere immediatamente la barra delle azioni in onCreate, ma con un po 'di ritardo in seguito, ad esempio quando il layout è terminato con la creazione:

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

Prima della tua prima chiamata .show () imposta la vista personalizzata visibile:

_actionbarRoot.setVisibility(View.VISIBLE);
getSupportActionBar().show();

1

Nel caso in cui tu abbia null perché stai usando la libreria di supporto , invece di getActionBar()chiamare getSupportActionBar().


1

Basta aggiungerlo a MainActivity nella funzione onCreate.

val actionBar = supportActionBar?.apply { hide() }

funziona su androidx. Basta aggiungere dopo setContentView () questa rigasupportActionBar?.apply { hide() }
Black_Zerg

0

Metti la tua schermata iniziale in un'attività separata e utilizzala startActivityForResultdal onCreatemetodo dell'attività principale per visualizzarla. Questo funziona perché, secondo i documenti:

Come caso speciale, se chiami startActivityForResult () con un requestCode> = 0 durante onCreate iniziale (pacchetto salvatoInstanceState) / onResume () della tua attività, la tua finestra non verrà visualizzata fino a quando non verrà restituito un risultato dall'attività avviata . Questo per evitare lo sfarfallio visibile quando si reindirizza a un'altra attività.

Probabilmente dovresti farlo solo se l'argomento onCreateè null(che indica un nuovo avvio dell'attività, anziché un riavvio a causa di una modifica della configurazione).


Questo non funziona. All'avvio di onCreate (), la barra delle azioni è già visibile. Questo è chiaramente visto nel debug.
Ilya Izhovkin,

0

Ho avuto ancora errori con il puntatore null e alla fine mi è stato di aiuto quando ho chiamato prima getWindow (). RequestFeature () e poi super.onCreate ()

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

0

Aggiungi questo nel tuo styles.xml

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

0

In realtà, si potrebbe semplicemente impostare spruzzata Activitycon NoActionBar e impostare il vostro principale activitycon barra delle operazioni.


0

Il modo migliore per farlo è in due fare la prima attività come attività vuota e il contenuto che si desidera mettere e poi dopo qualche tempo licenziare un'altra attività. Seguendo questa procedura puoi effettuare la prima attività come schermata iniziale senza barra delle azioni o altro. Ecco la mia prima attività

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

}
}

Dopodiché puoi mettere qualsiasi tua attività come prima attività Se non vuoi alcuna barra delle azioni in qualsiasi schermata, aggiungi semplicemente questa nei tuoi stili

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

0

Android Studio fornisce un modello di build per lo schermo intero, se usi Android Studio puoi seguire il passaggio seguente per implementare l'attività a schermo intero.

Primo passo per creare una nuova attività

Seleziona seleziona Attività a schermo intero

Fatto. Android Studio ha fatto il tuo lavoro, ora puoi controllare il codice per lo schermo intero.


-1

questo è il modo migliore che ho usato Vai al file Java, dopo 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(); 
        } 
    }

-3

Mi rendo conto che pubblicare link non è il modo migliore per fare le cose, ma ti consiglio vivamente di leggere la seguente documentazione dagli stessi Google. Questo è il documento Android ufficiale su come controllare l'interfaccia utente del tuo sistema (cose come actionbar, nav bar ecc.). Sfortunatamente le informazioni sono troppe da pubblicare direttamente, ma dopo aver letto questo capirai esattamente come mostrare e nascondere le funzionalità indipendentemente dalla versione per cui stai sviluppando, è così semplice!

Nel caso in cui il collegamento cambi, può essere trovato nella documentazione ufficiale di Android in fase di formazione -> Guida introduttiva -> Best practice per l'interfaccia utente -> gestione dell'interfaccia utente del sistema

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

inserisci qui la descrizione dell'immagine


-4

puoi usare questo:

getSupportActionBar().hide(); se non funziona prova questo:

getActionBar().hide();

se sopra non funziona prova in questo modo:

nella tua directory = res / valori / style.xml, apri style.xml -> c'è la parentmodifica dell'attributo inparent="Theme.AppCompat.Light.DarkActionBar"

se tutto non funziona troppo. non lo so più. ma per me funziona.


getSupportActionBar () hide ().; è stato menzionato nella risposta più votata, getActionBar (). hide (); è stato menzionato nella domanda e DarkActionBar è stato menzionato nella risposta di Son Nguyen Thanh. Inoltre questa domanda ha 4 anni e ha già molte risposte votate.
agosto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.