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

Ily*_*kin 240 android android-3.0-honeycomb android-actionbar

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

setContentView(R.layout.splash);
getActionBar().hide();
Run Code Online (Sandbox Code Playgroud)

并且此代码在某段时间后显示主UI:

setContentView(R.layout.main);
getActionBar().show();
Run Code Online (Sandbox Code Playgroud)

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

如何让动作栏隐形?

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

<item name="android:windowActionBar">false</item>
Run Code Online (Sandbox Code Playgroud)

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

小智 333

设置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
Run Code Online (Sandbox Code Playgroud)

这会创建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>
Run Code Online (Sandbox Code Playgroud)

这将使窗口标题的高度为零,因此几乎不可见.

在您的情况下,在完成显示启动画面后,您只需拨打电话即可

setContentView(R.layout.main);
getActionBar().show();
Run Code Online (Sandbox Code Playgroud)

你完成了 活动将从没有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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

同样的事情可以通过以下方式实现:

protected void onPostResume() {
    super.onPostResume();
    getActionBar().hide();
Run Code Online (Sandbox Code Playgroud)

但它可能需要一些额外的逻辑来检查这是否是活动的第一次显示.

这个想法是延迟一点ActionBar的隐藏.在某种程度上,我们让ActionBar显示出来,然后立即隐藏它.因此,我们超越了第一个非动画显示,下一个显示将被视为第二,因此它将被动画.

您可能已经猜到,在被延迟操作隐藏之前,可能会看到ActionBar .实际上就是这种情况.大部分时间都没有看到但是,偶尔,你可以看到ActionBar闪烁一瞬间.

无论如何这不是一个漂亮的解决方案,所以我欢迎任何建议.

此外 v7的支持动作条的用户,代码为:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
Run Code Online (Sandbox Code Playgroud)

  • @newton_guima是的,它确实有效.只记得使用supportRequestWindowFeature(Window.FEATURE_ACTION_BAR) (2认同)
  • @Cleric谢谢.我解决了我的问题设置`android:theme ="@ android:style/Theme.NoTitleBar"`进入Manifest然后`setTheme(R.style.MyTheme)`在主要活动的'onCreate`中; 这确保(在Android 4+中)在我的主题中定义之前避免默认的holo`ActionBar`的闪存(我到达这里寻找解决方法的方法;我实际上不需要任何启动画面). (2认同)
  • 我在`getWindow()之后调用`getSupportActionBar().hide();`requestFeature(Window.FEATURE_ACTION_BAR);`并且所有东西都被NPE炸毁了.有任何想法吗?`Theme.AppCompat`的问题? (2认同)

小智 50

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

getSupportActionBar().hide();
Run Code Online (Sandbox Code Playgroud)


小智 37

如果您使用的是ActionBarSherlock,请在Activity中使用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>
Run Code Online (Sandbox Code Playgroud)

  • 我不知道这是对伊利亚问题的回答.将主题设置为`Theme.Sherlock.NoActionBar`将意味着调用`getActionBar()`或`getSupportActionBar()`(以便随后显示操作栏)返回null ... (7认同)

Lar*_*iro 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>
Run Code Online (Sandbox Code Playgroud)

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

检查此链接Android:在查看加载时隐藏操作栏


Abd*_*lah 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>

要支持SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

    setTheme(R.style.Theme);      
    super.onCreate(savedInstanceState);

      ...........
      ...........
}
Run Code Online (Sandbox Code Playgroud)


S.A*_*san 15

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

进入android:theme="@style/Theme.AppCompat.NoActionBar"并且它工作,但界面是黑暗的.

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

之后,当我在开发者网站上搜索"AppCompat"时,我得到了这个.

所以我认为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>
Run Code Online (Sandbox Code Playgroud)

抱歉我的英语不好就像永远.


小智 12

对我来说最好的结果是使用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>
Run Code Online (Sandbox Code Playgroud)

活动:

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();
}
Run Code Online (Sandbox Code Playgroud)

}


小智 9

如果您使用一个Activity包含启动画面,那么您可以在使用时执行此操作SherlockActionBar

getSupportActionBar().hide();
Run Code Online (Sandbox Code Playgroud)

启动画面后,您可以再次显示...

getSupportActionBar().show();
Run Code Online (Sandbox Code Playgroud)

它应该与ActionBarAndroid 原生相同.


War*_*zit 6

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

编辑:贝娄解决方案给了我关于api <4.0的actionbarsherlock的问题,原因是setTheme不起作用前冰淇淋三明治

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

android:theme="@style/Theme.NoActionBar"
Run Code Online (Sandbox Code Playgroud)

然后在您的主要活动中:

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

    // Start regular onCreate()
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
Run Code Online (Sandbox Code Playgroud)


ars*_*tic 6

最好,最简单

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


小智 6

2015年,使用支持v7库和AppCompat主题,为您的Activity设置此主题.

<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>
Run Code Online (Sandbox Code Playgroud)


ing*_*abh 4

因为Splashscreen你应该使用这一行manifest而不是使用getActionBar()

<item name="android:windowActionBar">false</item>
Run Code Online (Sandbox Code Playgroud)

一旦 Splash在下面的Activity主要用途中完成,Activity或者什么也没有

<item name="android:windowActionBar">true</item>
Run Code Online (Sandbox Code Playgroud)