Comment masquer la barre d'actions avant la création d'une activité, puis l'afficher à nouveau?

243

Je dois implémenter un écran de démarrage dans mon application en nid d'abeille. J'utilise ce code dans l'activité onCreate pour afficher les éclaboussures:

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

et ce code pour afficher l'interface utilisateur principale après un certain temps:

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

Mais avant que onCreate ne soit appelé et que le splash n'apparaisse, il y a peu de temps lorsque la barre d'action est affichée.

Comment rendre la barre d'actions invisible?

J'ai essayé d'appliquer un thème à une activité sans barre d'action:

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

mais dans ce cas, getActionBar () renvoie toujours null et je n'ai trouvé aucun moyen de l'afficher à nouveau.

Ilya Izhovkin
la source
Pour Theme.AppCompat.Light... utilisez cette réponse [1] [1]: stackoverflow.com/a/25365193/1364896
Sami Eltamawy

Réponses:

335

La définition android:windowActionBar="false"désactive vraiment l'ActionBar mais, comme vous le dites, getActionBar();retourne null. Ceci est résolu par:

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

Cela crée l'ActionBar et le masque immédiatement avant qu'il n'ait la chance d'être affiché.

Mais maintenant, il y a un autre problème. Après avoir inséré windowActionBar="false"le thème, l'activité dessine son titre de fenêtre normal au lieu d'un ActionBar.
Si nous essayons d'éviter cela en utilisant certains des *.NoTitleBarthèmes courants ou si nous essayons de mettre <item name="android:windowNoTitle">true</item>dans notre propre thème, cela ne fonctionnera pas.
La raison en est que l'ActionBar dépend du titre de la fenêtre pour s'afficher - c'est-à-dire que l'ActionBar est un titre de fenêtre transformé.
Donc, l'astuce qui peut nous aider est d'ajouter une chose à notre thème d'activité XML:

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

Cela rendra le titre de la fenêtre avec une hauteur nulle, donc pratiquement invisible.

Dans votre cas, une fois que vous avez terminé d'afficher l'écran de démarrage, vous pouvez simplement appeler

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

et vous avez terminé. L'activité commencera sans aucun scintillement de la barre d'action ni affichage du titre de la fenêtre.

ADDON: Si vous affichez et masquez plusieurs fois l'ActionBar, vous avez peut-être remarqué que la première projection n'est pas animée. A partir de là, montrer et cacher sont animés. Si vous souhaitez également avoir une animation sur la première projection, vous pouvez utiliser ceci:

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 même chose peut être réalisée avec:

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

mais il peut avoir besoin d'une logique supplémentaire pour vérifier s'il s'agit de la première projection de l'activité.

L'idée est de retarder un peu le masquage de l'ActionBar. D'une certaine manière, nous laissons l'ActionBar être affiché, mais nous le cachons immédiatement. Ainsi, nous allons au-delà de la première projection non animée et la prochaine projection sera considérée comme la deuxième, elle sera donc animée.

Comme vous l'aurez deviné il y a une chance que le ActionBar pourrait être vu avant qu'il ait été caché par l'opération retardée. C'est effectivement le cas. La plupart du temps, rien n'est vu, mais pourtant, de temps en temps, vous pouvez voir le scintillement de l'ActionBar pendant une fraction de seconde.

En tout cas, ce n'est pas une jolie solution, donc j'accueille toutes les suggestions.

Addition pour l'utilisateur de la barre d'action de support v7, le code sera:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
Clerc
la source
2
@newton_guima oui, cela fonctionne. N'oubliez pas d'utiliser supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
scana
@Cleric - Comment faites-vous pour que tout cela fonctionne setTheme? Parce que votre réponse fonctionne très bien si je définis le thème à partir du manifeste, mais si je le fais dans onCreate(dans mon cas, le thème dépend d'une préférence pour le thème clair ou sombre), la barre d'action holo par défaut clignote avant celle que j'ai définie dans mon thème en tous cas. Mais cela vaut peut-être une autre question SO complète.
dentex
2
@Cleric Merci. J'ai résolu mon problème de configuration android:theme="@android:style/Theme.NoTitleBar"dans le manifeste, puis setTheme(R.style.MyTheme)dans l'activité principale onCreate; Cela garantit (dans Android 4+) d'éviter le flash de l'holo par défaut ActionBaravant celui que j'ai défini dans mon thème (je suis arrivé ici à la recherche d'un moyen de contourner cela; je n'ai en fait pas besoin d'un écran de démarrage).
dentex
2
J'appelle getSupportActionBar().hide();après getWindow().requestFeature(Window.FEATURE_ACTION_BAR);et tout explose avec un NPE. Des idées? Un problème avec Theme.AppCompat?
loeschg
1
@loeschg: J'ai eu le même problème et j'ai trouvé cette solution: stackoverflow.com/a/20315456/3514976
nonzaprej
50

Utilisation de ce code simple dans votre fichier .class pour masquer la barre d'actions

getSupportActionBar().hide();
gaurav
la source
37

Si vous utilisez ActionBarSherlock, utilisez le thème Theme.Sherlock.NoActionBar dans votre activité

<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
la source
1
De même pour Android standard 3+ ActionBar (pas Sherlock): <activity android:theme="@android:style/Theme.NoActionBar">.
Alex Semeniuk
Solution parfaite :) Merci.
alicanbatur
7
Je ne vois pas en quoi c'est une réponse à la question d'Ilya. Définir le thème sur Theme.Sherlock.NoActionBarsignifiera appeler getActionBar()ou getSupportActionBar()(pour afficher ensuite la barre d'action) renvoie null ...
Adil Hussain
@AlexSemeniuk Lorsque j'utilise cette ligne dans le manifeste, j'obtiens cette erreur:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
Si8
1
@ SiKni8 Êtes-vous sûr d'utiliser la bibliothèque API13 + pour votre application?
Alex Semeniuk
19

Créez deux styles:

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

Définissez AppThemeNoBar comme thème d'application et AppThemeBar sur l'activité dans laquelle vous souhaitez afficher l'ActionBar. En utilisant deux styles, vous ne verrez pas la barre d'actions pendant le chargement des vues.

Vérifier ce lien Android: masquer la barre d'action pendant le chargement de la vue

Laranjeiro
la source
Finalement! A travaillé pour moi. Merci. :)
Dhofca
Cela ne fonctionne pas sur Android 2.3.3 avec AppCompat. ActionBar est affiché. Cependant, cela fonctionne sur ie KitKat.
Yar
17

Salut j'ai une solution simple en utilisant 2 thèmes

  1. Thème de l'écran de démarrage (ajoutez-le au manifeste):

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

  2. thème normal (ajoutez-le dans votre activité par setTheme (R.style.Theme)):

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

Pour prendre en charge le SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

      ...........
      ...........
}
Abdullah
la source
15

J'essayais également de masquer la barre d'action sur Android 2.2, mais aucune de ces solutions ne fonctionnait. Tout se termine par un crash. J'ai vérifié le DDMS LOg, il me disait d'utiliser 'Theme.AppCompat'.Enfin j'ai résolu le problème en changeant la android:theme="@android:style/Theme.Holo.Light.NoActionBar"ligne

dans android:theme="@style/Theme.AppCompat.NoActionBar"et cela a fonctionné, mais l'interface était sombre.

puis j'ai essayé android:theme="@style/Theme.AppCompat.Light.NoActionBar"et finalement obtenu ce que je voulais.

Après cela, lorsque j'ai recherché «AppCompat» sur le site du développeur, j'ai obtenu ceci.

Je pense donc que la solution pour Android 2.2 est

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

Et désolé pour mon mauvais anglais comme toujours.

S.Ahsan
la source
12

Le meilleur résultat pour moi a été de créer une activité avec ThemeNoTitleBar et sans contenu en tant que lanceur. Ensuite, cette activité appelle directement l'autre.

Bien sûr, si vous le souhaitez, vous pouvez ajouter du contenu à l'activité Splash, mais dans mon cas, je voulais simplement montrer l'application directement.

Manifeste:

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

Activité:

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
la source
9

Si vous en utilisez un Activityinclus un écran de démarrage, vous pouvez le faire si vous utilisezSherlockActionBar

getSupportActionBar().hide();

Après l'écran de démarrage, vous pouvez l'afficher à nouveau avec ...

getSupportActionBar().show();

Il devrait en être de même avec le natif ActionBard'Android.

Luser_k
la source
6

La solution @Clerics fonctionne. Mais cela semble également être un problème avec certaines des applications natives de googles: googles, play store, talk. Aussi d'autres grandes applications comme skype.

EDIT : La solution ci-dessous m'a posé un problème pour actionbarsherlock sur api <4.0, la raison étant définieTheme ne fonctionne pas avant le sandwich à la crème glacée

Ajoutez les éléments suivants dans votre manifeste au sein de votre application ou balises d'activité:

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

Et puis dans votre activité principale:

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

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

meilleur et simple

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

arslan haktic
la source
6

2015, en utilisant la bibliothèque de support v7 avec le thème AppCompat, définissez ce thème pour votre activité.

<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
la source
4

Car Splashscreenvous devez utiliser cette ligne manifestet ne pas utilisergetActionBar()

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

et une fois lorsque Splash Activityest terminé dans l' Activityutilisation principale ci-dessous ou rien

<item name="android:windowActionBar">true</item>
ingsaurabh
la source
Cela fonctionne réellement si vous utilisez un thème différent pour la page de démarrage, puis la page principale de votre application. Utilisez simplement android: theme = "@ style / mytheme" pour l'activité principale (votre écran de démarrage) et la première activité de votre application qui n'est pas l'écran de démarrage pour échanger des thèmes.
ThanksMister
1
Cela donne une erreur aux niveaux actuels de l'API: "L'attribut de l'espace de noms Android manque à l'attribut." <item android:name="android:windowActionBar">true</item>se débarrasse de cette erreur, mais je ne sais pas si cela fonctionne toujours.
LarsH
3

Essayez ça, ça marche pour moi:

Ci-dessous se débarrasse de la barre de titre de l'activité

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Ci-dessous, élimine la barre de notification pour rendre l'activité en plein écran

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

(Exemple complet ci-dessous) Remarque: ces méthodes ont été appelées avant de définir l'affichage du contenu de notre activité.

@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();
    }
user3862873
la source
Veuillez expliquer pourquoi cela fonctionne ou pourquoi vous pensez que cela devrait fonctionner. Le simple fait de coller du code ne constitue pas une réponse complète.
Kris
@Kris, Oh je vois ce que tu veux dire, merci!
user3862873
3

cela peut être utile
ajouter ceci à votre manifeste

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

à votre santé

ralphgabb
la source
Pourquoi publier quelque chose de moins que la meilleure réponse dans une question aussi ancienne?
gsamaras
la «meilleure réponse» ne m'a pas aidé, alors je me suis retrouvé avec cette réponse et je l'ai affichée ici.
ralphgabb
2

Le meilleur moyen que je trouve après avoir lu toutes les options disponibles est de définir le thème principal sans ActionBar, puis de configurer MyTheme en code dans le parent de toutes les activités.

Manifeste:

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

BaseActivity:

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

De cette façon, j'évite ActionBar au démarrage de l'application!

DmRomantsov
la source
1

Les solutions déjà publiées sont venues avec l'effet secondaire, que le premier appel .show () n'a pas animé l'ActionBar pour moi. J'ai obtenu une autre belle solution, qui a corrigé cela:

Créez un dessin transparent transparent - quelque chose comme ça:

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

Définissez l'arrière-plan réel de la barre d'actions sur une vue personnalisée invisible que vous définissez dans la barre d'actions:

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

Définissez l'arrière-plan transparent de la barre d'action dans onCreate:

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

Imortant: Ne masquez pas la barre d'actions immédiatement dans onCreate, mais avec un peu de retard plus tard - par exemple lorsque la mise en page est terminée avec la création:

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

Avant votre premier appel .show (), définissez la vue personnalisée visible:

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

Dans le cas où vous avez null parce que vous utilisez la bibliothèque de support , au lieu de getActionBar()vous devez appeler getSupportActionBar().

Naskov
la source
1

Ajoutez simplement ceci à votre MainActivity dans la fonction onCreate.

val actionBar = supportActionBar?.apply { hide() }
MöritzRo
la source
c'est du travail sur androidx. Il suffit d'ajouter après setContentView () cette lignesupportActionBar?.apply { hide() }
Black_Zerg
0

Placez votre écran de démarrage dans une activité distincte et utilisez startActivityForResultla onCreateméthode de votre activité principale pour l'afficher. Cela fonctionne parce que, selon les documents:

Dans un cas particulier, si vous appelez startActivityForResult () avec un requestCode> = 0 lors de la première onCreate (Bundle savedInstanceState) / onResume () de votre activité, votre fenêtre ne s'affichera pas jusqu'à ce qu'un résultat soit renvoyé de l'activité démarrée . Cela permet d'éviter le scintillement visible lors de la redirection vers une autre activité.

Vous ne devriez probablement le faire que si l'argument to onCreateest null(indiquant un nouveau lancement de votre activité, par opposition à un redémarrage en raison d'un changement de configuration).

Ted Hopp
la source
Cela ne fonctionne pas. Lorsque onCreate () démarre, la barre d'action est déjà visible. Cela se voit clairement dans le débogage.
Ilya Izhovkin
0

J'avais toujours une erreur avec le pointeur nul et finalement cela a aidé lorsque j'ai appelé d'abord getWindow (). RequestFeature () puis super.onCreate ()

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

Ajoutez simplement ceci dans votre styles.xml

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

En fait, vous pouvez simplement définir splash Activityavec NoActionBar et définir votre principal activityavec la barre d'action.

Chauyan
la source
0

La meilleure façon de le faire est de faire de la première activité une activité vierge et du contenu que vous souhaitez mettre, puis de déclencher une autre activité après un certain temps. En suivant cette façon, vous pouvez faire de la première activité votre écran de démarrage sans barre d'action ou quoi que ce soit. Voici ma première activité

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

}
}

Après cela, vous pouvez mettre n'importe laquelle de vos activités comme première activité. Si vous ne voulez pas de barre d'action dans un écran, ajoutez-la simplement dans vos styles.

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

Android studio fournit un modèle de construction pour le plein écran, si vous utilisez Android studio, vous pouvez suivre l'étape ci-dessous pour implémenter l'activité en plein écran.

Première étape pour créer une nouvelle activité

Sélectionnez sélectionnez Plein écran Activité

Terminé. Le studio Android a fait votre travail, vous pouvez maintenant vérifier le code en plein écran.

Hitesh Dhamshaniya
la source
-1

c'est la meilleure façon d'utiliser Go to java file, après 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
la source
-3

Je me rends compte que la publication de liens n'est pas la meilleure façon de faire les choses, mais je vous recommande fortement de lire la documentation suivante de Google eux-mêmes. Ceci est le document officiel Android sur la façon de contrôler l'interface utilisateur de votre système (des choses comme la barre d'action, la barre de navigation, etc.). Malheureusement, les informations sont trop nombreuses pour être publiées directement, mais après avoir lu cela, vous comprendrez exactement comment afficher et masquer les fonctionnalités, quelle que soit la version pour laquelle vous développez, c'est si simple!

Dans le cas où le lien changerait jamais, il peut être trouvé dans la documentation officielle Android sous formation -> mise en route -> Meilleures pratiques pour l'interface utilisateur -> gestion de l' interface utilisateur du système

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

entrez la description de l'image ici

Chris
la source
-4

vous pouvez utiliser ceci:

getSupportActionBar().hide(); si cela ne fonctionne pas, essayez celui-ci:

getActionBar().hide();

si ci-dessus ne fonctionne pas, essayez comme ceci:

dans votre répertoire = res / values ​​/ style.xml, ouvrez style.xml -> il y a parentchangement d' attribut enparent="Theme.AppCompat.Light.DarkActionBar"

si tout ça ne marche pas trop. je ne sais plus. mais pour moi ça marche.

Sen
la source
getSupportActionBar (). hide (); a été mentionné dans la réponse la plus votée, getActionBar (). hide (); a été mentionné dans la question, et DarkActionBar a été mentionné dans la réponse de Son Nguyen Thanh. De plus, cette question a 4 ans et a déjà plusieurs réponses très votées.
2015