设置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"
主题后,活动将绘制其常规窗口标题而不是ActionBar。
如果我们尝试通过使用一些*.NoTitleBar
常规主题来避免这种情况,或者尝试放入<item name="android:windowNoTitle">true</item>
自己的主题,那么它将无法正常工作。
原因是ActionBar 依赖于窗口标题来显示自身-也就是说,ActionBar是转换后的窗口标题。
因此,可以帮助我们的窍门是在Activity主题xml中添加另一件事:
<item name="android:windowActionBar">false</item>
<item name="android:windowTitleSize">0dp</item>
这将使窗口标题的高度为零,因此实际上是不可见的。
对于您的情况,显示完初始屏幕后,您可以简单地调用
setContentView(R.layout.main);
getActionBar().show();
到此为止。该活动将开始,而不会出现ActionBar闪烁,也不会显示窗口标题。
ADDON:
如果您多次显示和隐藏ActionBar,也许您已经注意到第一次显示没有动画。从此显示和隐藏动画。如果您也想在第一个节目上放动画,则可以使用以下方法:
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();
但可能需要一些额外的逻辑来检查这是否是活动的首次展示。
想法是稍微延迟ActionBar的隐藏。我们以某种方式显示了ActionBar,但立即将其隐藏。因此,我们超越了第一个非动画显示,而下一个显示将被认为是第二个,因此将成为动画。
您可能已经猜到,ActionBar 可能会在被延迟的操作隐藏之前看到。实际上就是这种情况。在大多数情况下,什么都看不到,但是偶尔,您会看到ActionBar闪烁一瞬间。
无论如何,这不是一个很好的解决方案,因此我欢迎任何建议。
除 v7支持actionbar用户外,代码为:
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
Theme.AppCompat.Light
...,请使用此“ 如何回答 [1] [1]”:stackoverflow.com/a/25365193/1364896