设置android:windowActionBar="false"真正禁用动作栏,但然后,正如你所说,getActionBar();返回null。
解决方法是:
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
这将创建动作栏,并在它有机会显示之前立即隐藏它。
But now there is another problem. After putting windowActionBar="false" in the theme, the Activity draws its normal Window Title instead of an ActionBar.
If we try to avoid this by using some of the *.NoTitleBar stock themes or we try to put <item name="android:windowNoTitle">true</item> in our own theme, it won't work.
The reason is that the ActionBar depends on the Window Title to display itself - that is the ActionBar is a transformed Window Title.
So the trick which can help us out is to add one more thing to our Activity theme xml:
<item name="android:windowActionBar">false</item>
<item name="android:windowTitleSize">0dp</item>
这将使窗口标题的高度为零,因此实际上是不可见的。
在您的情况下,在显示启动画面后,您可以简单地调用
setContentView(R.layout.main);
getActionBar().show();
这样就做完了。活动将开始没有动作栏闪烁,也没有窗口标题显示。
插件:
如果你多次显示和隐藏动作栏,你可能会注意到第一次显示的不是动画。从那时起,显示和隐藏是动画。如果你想在第一次显示时也有动画,你可以使用这个:
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();
}
});
同样的事情也可以实现:
protected void onPostResume() {
super.onPostResume();
getActionBar().hide();
但是它可能需要一些额外的逻辑来检查这是否是Activity的第一次显示。
这个想法是延迟一点动作栏的隐藏。在某种程度上,我们让动作栏显示出来,但随后立即隐藏它。因此,我们超越了第一次非动画的展示,下一次展示将被认为是第二次,因此它将是动画的。
正如你可能已经猜到的那样,在动作栏被延迟操作隐藏之前,它有可能被看到。事实就是这样。大多数时候什么也看不见,但偶尔,你可以看到动作栏闪烁一秒钟。
无论如何,这都不是一个很好的解决方案,所以我欢迎任何建议。
添加为v7支持动作栏用户,代码将是:
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();