244 votes

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

J'ai besoin de implémente l'écran de démarrage dans mon nid d'application. J'ai utiliser ce code dans l'activité de onCreate de montrer splash:

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

et ce code pour afficher principal de l'INTERFACE utilisateur après un certain temps:

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

Mais avant onCreate est appelé et splash apparaît, il y a peu de temps lors de la barre d'actions indiqué.

Comment puis je l'ai fait de ne pas le montrer?

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 null et je n'ai trouvé aucun moyen de le montrer à nouveau.

336voto

Cleric Points 1638

Paramètre android:windowActionBar="false" vraiment désactive le contrôle ActionBar mais alors, comme vous le dites, getActionBar(); renvoie la valeur null. Ce problème 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 de l'ActionBar et cache immédiatement avant qu'il a eu la chance d'être affiché.

Mais maintenant, il est un autre problème. Après la mise windowActionBar="false" dans le thème, l'Activité tire sa normal de Titre de la Fenêtre au lieu d'une ActionBar.
Si nous essayons d'éviter cela en utilisant une partie de l' *.NoTitleBar du stock des thèmes ou nous essayons de mettre en <item name="android:windowNoTitle">true</item> dans notre propre thème, ça ne marchera pas.
La raison en est que l'ActionBar dépend sur le Titre de la Fenêtre d'affichage lui-même - qui est l'ActionBar est une transformée de Titre de la Fenêtre.
Donc, l'astuce qui peut nous aider est d'ajouter une chose de plus à notre Activité thème 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, après vous avez terminé avec l'affichage de l'écran de démarrage, vous pouvez simplement appeler

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

et vous avez terminé. L'Activité va démarrer sans ActionBar scintillement, ni de Titre de la Fenêtre d'affichage.

ADDON: Si vous avez d'afficher et de masquer l'ActionBar plusieurs fois peut-être vous avez remarqué que la première démonstration est pas animé. À partir de là, l'affichage et le masquage sont animés. Si vous voulez avoir de l'animation sur la première montre aussi, 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é avec:

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

mais il peut avoir besoin de la logique supplémentaire pour vérifier si c'est la première exposition de l'Activité.

L'idée est de retarder un peu le cache de l'ActionBar. De façon à nous laisser l'ActionBar être montré, mais alors de le cacher immédiatement. Nous avons donc aller au-delà de la première non-animés montrant et en les montrant prochain sera considéré deuxième, il sera donc animé.

Comme vous l'aurez deviné il y a une chance que l'ActionBar pourrait être vu précédemment, il a été caché par le retard de l'opération. C'est effectivement le cas. La plupart du temps on ne voit rien, mais pourtant, une fois dans un certain temps, vous pouvez voir l'ActionBar scintillement pendant une fraction de seconde.

En tout cas, ce n'est pas une belle solution, donc je souhaite la bienvenue à toutes les suggestions.

Plus pour v7 soutien actionbar de l'utilisateur, le code sera:

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

37voto

kaubatak Points 475

Si vous utilisez ActionBarSherlock, puis utiliser le Thème.Sherlock.NoActionBar Thème de 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>

19voto

Laranjeiro Points 667

Créer 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>

Ensemble AppThemeNoBar de l'application de thème et AppThemeBar à l'activité où vous voulez afficher l'ActionBar. À l'aide de deux styles que vous ne verrez pas la barre d'Action alors que les vues sont en cours de chargement.

Suivez ce lien Android: masquer la barre d'action tout en vue de charge

17voto

Abdullah Points 1108

Salut j'ai une solution simple à l'aide de 2 thèmes

  1. Écran de démarrage de thème (ajouter au manifeste):

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

  2. thème normale (l'ajouter dans votre activité par setTheme(R. style.Thème)):

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

À l'appui de SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

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

12voto

javak Points 71

Meilleur résultat pour moi était de créer une activité avec ThemeNoTitleBar et sans contenu comme lanceur. Puis cette activité appeler directement à l'autre.

Bien sûr, si vous voulez, vous pouvez ajouter du contenu pour le démarrage de l'Activité, mais dans mon cas, je voulais juste 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();
}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X