web-dev-qa-db-fra.com

Comment masquer la barre d'action avant la création de l'activité, puis la montrer à nouveau?

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

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 before onCreate est appelé et Splash apparaît. La barre d'action est peu de temps.

Comment puis-je rendre la barre d'action invisible?

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

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

mais dans ce cas, getActionBar () renvoie toujours la valeur null et je n’ai trouvé aucun moyen de le montrer à nouveau.

232
Ilya Izhovkin

Le paramétrage de Android:windowActionBar="false" désactive réellement la barre d’action mais, comme vous le dites, getActionBar(); renvoie 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 la barre d’action et la masque immédiatement avant qu’elle puisse être affichée.

Mais maintenant, il y a un autre problème. Après avoir placé windowActionBar="false" dans 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 thèmes de stock *.NoTitleBar 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 le ActionBar dépend du titre de la fenêtre à s’auto-afficher - c’est-à-dire que le ActionBar est un titre de fenêtre transformé.
Le truc qui puisse nous aider est donc 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, lorsque vous avez terminé d’afficher l’écran d’accueil, vous pouvez simplement appeler le 

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

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

ADDON: Si vous affichez et masquez l'ActionBar plusieurs fois, vous avez peut-être remarqué que l'affichage du premier _ est non animé. À partir de ce moment-là, montrer et se cacher sont animés. Si vous voulez aussi avoir une animation lors de 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 faudra peut-être un peu plus de logique pour vérifier s'il s'agit du premier affichage de l'activité.

L’idée est de retarder un peu la dissimulation de la barre d’action. D'une certaine manière, nous permettons d'afficher la barre d'actions, mais de la masquer immédiatement. Ainsi, nous allons au-delà de la première diffusion non animée et la projection suivante sera considérée comme la deuxième, donc elle sera animée.

Comme vous l'avez peut-être deviné, il est possible que la barre d'action pourrait soit vue avant d'être masquée par l'opération retardée. C'est en fait le cas. La plupart du temps, rien ne se voit mais pourtant, de temps en temps, vous pouvez voir le scintillement de la barre Action pendant une fraction de seconde.

En tout cas, ce n’est pas une belle solution, toutes les suggestions sont les bienvenues.

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

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

Utilisation de ce code simple dans votre fichier .class pour masquer la barre d’action

getSupportActionBar().hide();
45
gaurav

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

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 en tant que thème d'application et AppThemeBar sur l'activité pour laquelle vous souhaitez afficher le composant ActionBar. En utilisant deux styles, vous ne verrez pas la barre d'action pendant le chargement des vues. 

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

19
Laranjeiro

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

  1. Thème de l'écran d'accueil (à ajouter 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 à 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);

      ...........
      ...........
}
17
Abdullah

J'essayais également de cacher Action Bar sur Android 2.2, mais aucune de ces solutions ne fonctionnait. Tout se termine par un crash. J'ai vérifié la base de données DDMS, il me disait d’utiliser «Theme.AppCompat». Enfin, j’ai résolu le problème en modifiant le Android:theme="@Android:style/Theme.Holo.Light.NoActionBar"Line.

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

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

Après cela, lorsque j'ai cherché 'AppCompat' sur Site du développeur, j’ai eu 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.

14
S.Ahsan

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

}

11
javak

Si vous utilisez une Activity incluse un écran de démarrage, vous pouvez le faire si vous utilisez SherlockActionBar

getSupportActionBar().hide();

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

getSupportActionBar().show();

Il devrait en être de même avec ActionBar d'Android.

9
Luser_k

meilleur et simple

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

6
arslan haktic

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>
6
Son Nguyen Thanh

La solution @Clerics fonctionne. Mais cela semble également être un problème avec certaines des applications natives de Google: Google, Play Store, parler. 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 setTheme ne fonctionne pas avant le sandwich à la crème glacée

Ajoutez ce qui suit dans votre manifeste au sein de votre application ou de vos balises d'activité:

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

Et ensuite 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);
6
Warpzit

Pour Splashscreen, vous devez utiliser cette ligne dans manifest et ne pas utiliser getActionBar()

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

et une fois lorsque Splash Activity est terminé dans la Activity principale ci-dessous ou rien

<item name="Android:windowActionBar">true</item>
4
ingsaurabh

Essayez ceci, ç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 que l'activité passe en plein écran

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

(Exemple complet ci-dessous) Prenez note: 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();
    }
3
user3862873

cela peut être pratique
Ajoutez ceci à votre manifeste

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

à votre santé

3
ralphgabb

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 dans le code parent de toute l'activité.

Manifeste:

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

BaseActivity:

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

Cela me permet d’éviter ActionBar au démarrage de l’application!

2
DmRomantsov

Si vous avez la valeur null car vous utilisez la bibliothèque support library , au lieu de getActionBar(), vous devez appeler getSupportActionBar().

1
Naskov

Les solutions déjà postées sont venues avec l’effet latéral, à savoir que le premier appel .show () n’animait pas la barre d’action pour moi .

Créez un dessin 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 de la barre d’action sur une vue personnalisée invisible que vous définissez dans la barre d’action:

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

Important: Ne cachez pas la barre d’action immédiatement dans onCreate, mais avec un peu de retard par la suite - par exemple. quand 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 comme suit:

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

Placez votre écran de démarrage dans une activité distincte et utilisez startActivityForResult depuis la méthode onCreate de votre activité principale pour l'afficher. Cela fonctionne parce que, selon la documentation:

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

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

0
Ted Hopp

Ajoutez simplement ceci dans votre styles.xml

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

J'avais toujours une erreur avec le pointeur null et finalement cela m'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();
0
Matwosk

Ajoutez simplement ceci à votre MainActivity dans la fonction onCreate.

val actionBar = supportActionBar?.apply { hide() }
0
MöritzRo

Pour ce faire, la meilleure solution consiste à créer la première activité en tant qu’activité vide et le contenu que vous souhaitez insérer, puis au bout d’un certain temps, déclenchez une autre activité . En procédant ainsi, vous pouvez créer la première activité en tant qu’écran de démarrage sans action. bar 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 placer n'importe laquelle de vos activités en tant que première activité Si vous ne voulez aucune barre d'action dans aucun écran, ajoutez-la simplement dans vos styles.

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

Android studio fournit un modèle de construction pour le plein écran. Si vous utilisez Android Studio, vous pouvez suivre les étapes ci-dessous pour mettre en œuvre une activité plein écran.

 First Step to Create new Activity

 Select select Full screen Activity

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

0

En fait, vous pouvez simplement définir splash Activity avec NoActionBar Et définir votre activity principale avec une barre d’action. 

0
Chauyan