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

问题描述 投票:235回答:25

我需要在我的蜂窝应用程序中实现启动画面。我在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,我发现无法再显示它。

android android-3.0-honeycomb android-actionbar
25个回答
332
投票

设置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();

你完成了活动将从没有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支持actionbar用户的添加,代码将为:

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

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>

4
投票

对于Splashscreen你应该在manifest中使用这一行而不要使用getActionBar()

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

有一次当Splash Activity在主要的Activity完成使用下面或没有

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

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

3
投票

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

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

干杯


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!


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

1
投票

如果您因为使用支持库而无法使用null,则需要调用getActionBar()而不是getSupportActionBar()


0
投票

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

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

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


0
投票

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

onCreate

48
投票

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

getSupportActionBar().hide();

0
投票

只需在styles.xml中添加它即可

null

0
投票

实际上,你可以简单地用public void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR); super.onCreate(savedInstanceState); getActionBar().show(); 设置splash <item name="android:windowNoTitle">true</item> 并用操作栏设置你的主要Activity


0
投票

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

NoActionBar

之后,您可以将任何活动作为第一个活动。如果您不想在任何屏幕中显示任何操作栏,那么只需在您的样式中添加它即可

activity

0
投票

Android studio提供全屏幕构建模板,如果您使用Android studio,您可以按照以下步骤实施全屏活动。

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>

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


0
投票

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

First Step to Create new Activity

-2
投票

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

如果链接有变化,可以在官方android文档下找到培训 - >入门 - >用户界面的最佳实践 - >管理系统ui

Select select Full screen Activity


-4
投票

你可以用这个:

val actionBar = supportActionBar?.apply { hide() } 如果它不起作用试试这个:

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

如果上面不起作用尝试这样:

在你的目录= res / values / style.xml中,打开style.xml - >有一个属性getSupportActionBar().hide();更改为getActionBar().hide();

如果所有这些都不起作用。我不知道了。但对我来说这很有效。


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>

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>

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

检查此链接Android: hide action bar while view load


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

      ...........
      ...........
}

15
投票

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

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

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

之后我在Developer Site I got This.上搜索了“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>

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


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

}


9
投票

如果你使用一个Activity包括一个闪屏,那么你可以这样做,如果你使用SherlockActionBar

getSupportActionBar().hide();

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

getSupportActionBar().show();

它应该与Android的原生ActionBar相同。


6
投票

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

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

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.