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


243

我需要在蜂窝应用程序中实现启动屏幕。我在活动的onCreate中使用以下代码来显示启动画面:

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

这段代码将在一段时间后显示主界面:

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

但是调用onCreate并显示启动消息之前,只有很少的时间显示操作栏。

如何使操作栏不可见?

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

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

但是在那种情况下,getActionBar()总是返回null,而我找不到再次显示它的方法。


对于Theme.AppCompat.Light...,请使用此“ 如何回答 [1] [1]”:stackoverflow.com/a/25365193/1364896
Sami Eltamawy 2014年

Answers:


335

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

2
@newton_guima是的,它确实有效。不过,别忘了使用supportRequestWindowFeature(Window.FEATURE_ACTION_BAR)
SCANA

@Cleric-您如何使用所有这些setTheme?因为如果我从清单中设置主题,您的答案会很好,但是如果我将其设置为主题onCreate(在我的情况下,主题取决于对深色主题的偏好),则默认的全息操作栏会在我为主题设置的主题之前闪烁无论如何。但这也许值得另一个完整的SO问题。
dentex

2
@Cleric谢谢。我将问题设置android:theme="@android:style/Theme.NoTitleBar"为清单,然后setTheme(R.style.MyTheme)在主要活动中解决了onCreate;这样可以确保(在Android 4+中)避免在ActionBar我定义主题之前闪过默认晕圈(我是来这里寻找解决此问题的方法;实际上不需要任何启动画面)。
dentex 2014年

2
getSupportActionBar().hide();之后getWindow().requestFeature(Window.FEATURE_ACTION_BAR);,我打电话给NPE炸毁一切。有任何想法吗?有问题Theme.AppCompat吗?
loeschg 2014年

1
@loeschg:我遇到了同样的问题,并找到了以下解决方案:stackoverflow.com/a/20315456/3514976
nonzaprej 2015年

50

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

getSupportActionBar().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>

1
标准Android 3+ ActionBar(无Sherlock)也是如此:<activity android:theme="@android:style/Theme.NoActionBar">
Alex Semeniuk 2013年

完美的解决方案:)谢谢。
alicanbatur

7
我看不出这是对伊利亚问题的解答。将主题设置为Theme.Sherlock.NoActionBar将意味着调用getActionBar()getSupportActionBar()(以随后显示操作栏)返回null ...
Adil Hussain 2013年

@AlexSemeniuk当我在清单中使用该行时,出现以下错误:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
2013

1
@ SiKni8确定要为应用程序使用API​​13 +库吗?
Alex Semeniuk

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的活动。使用两种样式,您将在加载视图时看不到Action栏。

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


最后!为我工作。谢谢。:)
Dhofca 2014年

这在带有AppCompat的Android 2.3.3上不起作用。显示了ActionBar。但是,这适用于KitKat。
2014年

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"并且工作正常,但是界面很暗。

然后我尝试了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>

对不起,我的英语糟透了。


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>

活动:

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

ActionBarAndroid 本机应该与此相同。


6

@Clerics解决方案有效。但这似乎也与某些Google本地应用程序有关:Google,Play商店,交谈。还有其他大型应用程序,例如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);

6

最好和简单

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


6

2015年,使用带有AppCompat主题的支持v7库,为您的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>

并且一次Activity在以下主要Activity用途中完成飞溅后

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

如果您对初始页面使用了与主题主页不同的主题,那么这实际上可以工作。只需将android:theme =“ @ style / mytheme”用于主要活动(您的启动屏幕)和应用程序的第一个活动(不是启动屏幕换出主题)即可。
ThankMister 2012年

1
这会在当前API级别产生错误:“属性缺少android名称空间前缀。” <item android:name="android:windowActionBar">true</item>摆脱了这个错误,但我不知道它是否仍然有效。
LarsH 2015年

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

请说明为什么这样做或为什么您认为应该这样做。仅粘贴代码并不能提供完整的答案。
克里斯(Kris)2014年

@Kris,哦,我明白你的意思了,谢谢!
user3862873

3

这可能会方便
将其添加到您的清单中

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

干杯


为什么在这样一个老问题中发布的答案不如最高答案呢?
gsamaras

“最佳答案”并没有帮助我,所以找到了这个答案并将其发布在这里。
ralphgabb 2014年

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设置动画。我得到了另一个不错的解决方案,该解决方案修复了该问题:

创建一个透明的可绘制对象-像这样:

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


1

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

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

它在androidx上工作。只需在setContentView()之后添加此行supportActionBar?.apply { hide() }
Black_Zerg,

0

将启动屏幕放在单独的活动中,并使用startActivityForResult您的主要活动的onCreate方法进行显示。之所以有效,是因为根据文档:

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

您可能仅应在参数为时执行此onCreate操作null(指示活动的全新启动,而不是由于配置更改而重新启动)。


这是行不通的。当onCreate()启动时,操作栏已经可见。这在调试中很明显。
伊利亚·伊佐夫金

0

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

public void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
getActionBar().show();


0

实际上,您可以简单地设置飞溅ActivityNoActionBaractivity通过操作栏设置主体。


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>

0

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

创建新活动的第一步

选择选择全屏活动

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


-1

这是我用过的最好的方法,之后转到Java文件onCreate

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

-3

我知道发布链接不是最好的处理方式,但是我强烈建议您阅读Google本身的以下文档。这是有关如何控制系统ui的官方android文档(如actionbar,nav bar等)。不幸的是,该信息太多了,无法直接发布,但是阅读此书后,无论您要开发的版本是什么,您都将确切了解如何显示和隐藏功能,它是如此简单!

万一链接发生更改,可以在受培训的官方android文档下找到它->使用入门 -> 用户界面最佳做法 -> 管理系统ui

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

在此处输入图片说明


-4

您可以使用此:

getSupportActionBar().hide(); 如果不起作用,请尝试以下方法:

getActionBar().hide();

如果上述方法不起作用,请尝试这样:

在您的目录= res / values / style.xml中,打开style.xml->有一个属性 parent更改为parent="Theme.AppCompat.Light.DarkActionBar"

如果所有的方法都不起作用。我不知道了。但对我来说,它有效。


getSupportActionBar()。hide(); 在投票最高的答案中提到了getActionBar()。hide(); 在问题中提到了“ DarkActionBar”,在孙正义的回答中提到了“ DarkActionBar”。加上这个问题已有4年历史了,已经有了几个高票赞成的答案。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.