如何在创建活动之前隐藏操作栏,然后再次显示它?

时间:2011-12-14 06:24:39

标签: android android-3.0-honeycomb android-actionbar

我需要在我的蜂窝应用中实现启动画面。 我在activity的onCreate中使用此代码来显示splash:

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

以及此代码在某段时间后显示主UI:

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

但是在onCreate调用之前并且出现了splash,显示操作栏时会有少量时间。

如何让动作栏隐身?

我尝试将主题应用于没有操作栏的活动:

<item name="android:windowActionBar">false</item>

但是在这种情况下,getActionBar()总是返回null,我发现无法再显示它。

27 个答案:

答案 0 :(得分:331)

设置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闪烁开始,也不显示Window Title。

<强> 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支持操作栏用户,

添加,代码为:

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

答案 1 :(得分:46)

在.class文件中使用此简单代码隐藏操作栏

getSupportActionBar().hide();

答案 2 :(得分:37)

如果您使用的是ActionBarSherlock,请在您的活动中使用Theme.Sherlock.NoActionBar主题

<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>

答案 3 :(得分:19)

创建两种样式:

<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>

将AppThemeNoBar设置为应用程序主题,将AppThemeBar设置为要显示ActionBar的活动。 使用两种样式,在加载视图时,您将看不到操作栏。

点击此链接Android: hide action bar while view load

答案 4 :(得分:17)

您好我有一个简单的解决方案,使用2个主题

  1. 启动画面主题(将其添加到清单中):

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

  2. 普通主题(通过setTheme(R.style.Theme)将其添加到您的活动中):

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

  3. 支持SDK 10:

    @Override    
    public void onCreate(Bundle savedInstanceState) {
    
        setTheme(R.style.Theme);      
        super.onCreate(savedInstanceState);
    
          ...........
          ...........
    }
    

答案 5 :(得分:15)

我还试图在Android 2.2上隐藏Action Bar,但这些解决方案都没有奏效。一切都以崩溃告终。我检查了DDMS LOg,它告诉我使用&#39; Theme.AppCompat&#39;。最后我通过更改android:theme="@android:style/Theme.Holo.Light.NoActionBar"行来解决问题

进入android:theme="@style/Theme.AppCompat.NoActionBar"并且它有效,但界面很暗。

然后我尝试了android:theme="@style/Theme.AppCompat.Light.NoActionBar",最后得到了我想要的东西。

之后我搜索了AppCompat&#39;在Developer Site I got This.

所以我认为Android 2.2的解决方案是

<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

抱歉我的英语很糟糕。

答案 6 :(得分:11)

对我来说,最好的结果是使用ThemeNoTitleBar创建一个活动而没有内容作为启动器。然后这个活动直接呼叫另一个。

当然,如果你想要,你可以向Splash Activity添加内容,但就我而言,我只是想直接显示应用程序。

清单:

<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>

的活动:

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();
}

}

答案 7 :(得分:9)

如果您使用一个Activity包含启动画面,那么如果您使用SherlockActionBar

,则可以执行此操作
getSupportActionBar().hide();

在启动画面后,您可以再次使用...

显示它
getSupportActionBar().show();

与Android的原生ActionBar应该相同。

答案 8 :(得分:6)

2015年,使用支持v7库和AppCompat主题,为您的活动设置此主题。

<style name="AppTheme.AppStyled" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/md_indigo_100</item>
    <item name="colorPrimary">@color/md_indigo_500</item>
    <item name="colorAccent">@color/md_red_500</item>
    <item name="android:textColorPrimary">@color/md_white_1000</item>
    <item name="android:textColor">@color/md_purple_500</item>
    <item name="android:textStyle">bold</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

答案 9 :(得分:6)

@Clerics解决方案有效。但这似乎也是谷歌本土应用程序的一个问题:谷歌,游戏商店,谈话。还有其他大型应用,如Skype。

编辑:Bellow解决方案给了我关于api的actionbarsherlock的问题&lt; 4.0,之所以设置主题不起作用前冰淇淋三明治

在您的应用程序或活动代码中的清单中添加以下内容:

android:theme="@style/Theme.NoActionBar"

然后在你的主要活动中:

    // Set theme
    setTheme(R.style.YOUR_THEME);
    getSupportActionBar().setTitle(R.string.title);

    // Start regular onCreate()
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

答案 10 :(得分:6)

最简单

requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

答案 11 :(得分:4)

对于Splashscreen,您应该在manifest中使用此行,不要使用getActionBar()

<item name="android:windowActionBar">false</item>

当Splash Activity在主Activity完成时使用以下内容,或者没有任何内容

<item name="android:windowActionBar">true</item>

答案 12 :(得分:3)

试试这个,它对我有用:

下面摆脱了活动的标题栏

 requestWindowFeature(Window.FEATURE_NO_TITLE);

下面删除了使活动全屏显示的通知栏

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

(下面的完整示例) 请注意:在我们设置活动的内容视图之前调用了这些方法

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Sets Application to full screen by removing action bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);    
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_main); 

        // without this check, we would create a new fragment at each orientation change!
        if (null == savedInstanceState)
            createFragment();
    }

答案 13 :(得分:3)

这可能很方便 将此添加到您的清单

 android:theme="@android:style/Theme.Light.NoTitleBar" 

欢呼声

答案 14 :(得分:2)

在阅读所有可用选项后,我找到的最佳方法是设置不带ActionBar的主题,然后在所有Activity的父代码中设置MyTheme。

清单:

<application
...
        android:theme="@android:style/Theme.Holo.Light.NoActionBar"
...>

BaseActivity:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.GreenHoloTheme);
}

这样可以帮助我在应用程序启动时避免使用ActionBar!

答案 15 :(得分:1)

如果您使用支持库而为null,则需要拨打getActionBar()而不是getSupportActionBar()

答案 16 :(得分:1)

已经发布的解决方案伴随着副作用,第一个.show()调用没有为我动画ActionBar。 我得到了另一个很好的解决方案,它解决了这个问题:

创建一个透明的drawable - 类似的东西:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
       android:color="#00000000" />
</shape>

将实际操作栏背景设置为您在操作栏上设置的不可见自定义视图:

getSupportActionBar().setCustomView(R.layout.actionbar_custom_layout);
      getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
              ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);

在onCreate中设置操作栏的透明背景:

getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_transparent));

重要:不要立即在onCreate中隐藏操作栏,但稍后会稍微延迟 - 例如当布局完成创建时:

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    getSupportActionBar().hide();
                }
            });

在第一次.show()调用之前,将自定义视图设置为可见:

_actionbarRoot.setVisibility(View.VISIBLE);
getSupportActionBar().show();

答案 17 :(得分:0)

Android Studio提供了用于全屏显示的构建模板,如果您使用Android Studio,则可以按照以下步骤实施全屏显示活动。

First Step to Create new Activity

Select select Full screen Activity

完成。 Android Studio完成了您的工作,现在您可以检查全屏代码。

答案 18 :(得分:0)

执行此操作的最佳方法是将第一个活动作为空白活动和您要放置的内容,然后在一段时间后触发另一个活动。 通过这种方式,您可以将第一个活动作为启动画面,而无需操作栏或任何操作。 继承人我的第一个活动

package com.superoriginal.rootashadnasim.syllabus;

import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class first_screen extends AppCompatActivity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first_screen);


    final Handler h=new Handler();
    h.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent=new     Intent(getApplicationContext(),DrawerChooseBranchMainActivity.class);
            startActivity(intent);
        }
    },2000);

}
}

之后,您可以将任何活动作为第一项活动 如果你想在任何屏幕上都没有动作栏,那么只需在你的风格中添加它

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

答案 19 :(得分:0)

只需在onCreate函数中将其添加到您的MainActivity中即可。

val actionBar = supportActionBar?.apply { hide() }

答案 20 :(得分:0)

这是我使用的最好方法 在onCreate之后转到Java文件:

@Override
    protected void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        // Take instance of Action Bar 
        // using getSupportActionBar and 
        // if it is not Null 
        // then call hide function 
        if (getSupportActionBar() != null) { 
            getSupportActionBar().hide(); 
        } 
    }

答案 21 :(得分:0)

将启动画面放在单独的活动中,并使用主活动的onCreate方法中的startActivityForResult来显示它。这是有效的,因为根据文档:

  

作为一种特殊情况,如果在活动的初始onCreate(Bundle savedInstanceState)/ onResume()期间使用requestCode&gt; = 0调用startActivityForResult(),则在返回结果之前不会显示您的窗口从开始的活动。这是为了避免在重定向到另一个活动时出现明显的闪烁。

只有当onCreate的参数为null时(表示您的活动重新启动,而不是因配置更改而重新启动),您才应该这样做。

答案 22 :(得分:0)

只需在styles.xml中添加

即可
<item name="android:windowNoTitle">true</item>

答案 23 :(得分:0)

实际上,您只需使用Activity设置启动NoActionBar即可 并使用操作栏设置主activity

答案 24 :(得分:0)

我仍然使用空指针时出错,最后在我第一次调用getWindow()。requestFeature()然后调用super.onCreate()

时它有所帮助
public void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
getActionBar().show();

答案 25 :(得分:-2)

我发现发布链接不是最好的方法,但我强烈建议您自己阅读Google的以下文档。这是关于如何控制你的系统ui的官方android文档(比如actionbar,nav bar等)。不幸的是,信息太多而无法直接发布,但在阅读本文后,您将了解如何显示和隐藏功能,无论您正在开发什么版本,它都非常简单!

如果链接发生变化,可以在培训下的官方Android文档下找到 - &gt; 入门 - &gt; 用户界面的最佳做法 - &gt; 管理系统ui

https://developer.android.com/training/system-ui/index.html

enter image description here

答案 26 :(得分:-4)

你可以用这个:

getSupportActionBar().hide();如果它不起作用,请试试这个:

getActionBar().hide();

如果上面没有工作,请尝试这样:

在你的目录= res / values / style.xml中,打开style.xml - &gt;属性parent更改为parent="Theme.AppCompat.Light.DarkActionBar"

如果所有这些都不起作用。我不知道了。但对我而言,它确实有效。