设置android:windowActionBar="false" 确实会禁用ActionBar,但正如您所说,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
这会创建 ActionBar 并在它有机会显示之前立即隐藏它。
但是现在还有另一个问题。将windowActionBar="false" 放入主题后,Activity 将绘制其正常的 Window Title 而不是 ActionBar。
如果我们尝试通过使用一些 *.NoTitleBar 股票主题来避免这种情况,或者我们尝试将 <item name="android:windowNoTitle">true</item> 放在我们自己的主题中,那么它将不起作用。
原因是 ActionBar 依赖 Window Title 来显示自己 - 也就是说 ActionBar 是一个转换后的 Window Title。
因此,可以帮助我们的诀窍是在我们的 Activity 主题 xml 中再添加一件事:
<item name="android:windowActionBar">false</item>
<item name="android:windowTitleSize">0dp</item>
这将使窗口标题的高度为零,因此实际上是不可见的。
在你的情况下,在你完成显示启动画面后,你可以简单地调用
setContentView(R.layout.main);
getActionBar().show();
你就完成了。 Activity 开始时不会闪烁 ActionBar,也不会显示 Window Title。
插件:
如果您多次显示和隐藏 ActionBar,您可能已经注意到 first 显示是 not 动画的。从那时起,显示和隐藏都是动画的。如果你也想在第一次放映时有动画,你可以使用这个:
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 的第一次显示。
这个想法是稍微延迟ActionBar的隐藏。在某种程度上,我们让 ActionBar 显示出来,然后立即隐藏它。因此,我们超越了第一次非动画放映,下一次放映将被视为第二次放映,因此它将被动画化。
正如您可能已经猜到的,有可能在 ActionBar 被延迟操作隐藏之前可以看到。实际情况就是这样。大多数情况下什么都看不到,但偶尔,您会看到 ActionBar 闪烁一瞬间。
无论如何,这不是一个很好的解决方案,所以我欢迎任何建议。
添加 v7支持actionbar用户,代码为:
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();