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 *.NoTitleBar
thè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();
Theme.AppCompat.Light
... utilisez cette réponse [1] [1]: stackoverflow.com/a/25365193/1364896