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

我需要在我的蜂窝应用程序中实现启animation面。 我在activity的onCreate中使用这个代码来显示splash:

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

而这段代码在一段时间后显示主UI:

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

但是 onCreate被调用之前会出现splash,当显示action bar时有less量时间。

我怎么能使它不显示?

我试图将主题应用到没有操作的活动栏中:

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

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

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

这创build了ActionBar,并在它有机会显示之前立即隐藏它。

但现在还有另一个问题。 在主题中放置windowActionBar="false"之后,Activity将绘制正常的Window标题而不是ActionBar。
如果我们试图通过使用一些*.NoTitleBar股票主题来避免这种情况,或者我们尝试在我们自己的主题中放置<item name="android:windowNoTitle">true</item> ,它将不起作用。
原因是ActionBar 依赖于窗口标题来显示自己 – 也就是说,ActionBar是一个转换后的窗口标题。
所以可以帮助我们的技巧是添加一个更多的东西到我们的Activity主题xml:

 <item name="android:windowActionBar">false</item> <item name="android:windowTitleSize">0dp</item> 

这将使窗口标题具有零高度,因此实际上不可见。

在你的情况下,完成显示启animation面后,你可以直接调用

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

你完成了。 该活动将开始时没有ActionBar闪烁,也不显示窗口标题。

附加:如果您多次显示和隐藏ActionBar,也许您已经注意到第一个显示不是animation。 从此显示和隐藏是animation。 如果你想在第一个显示的animation也可以使用这个:

 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显示,但是立即隐藏它。 因此,我们超越了第一个非animation显示,下一个显示将被视为第二个,因此它将是animation。

正如您可能已经猜到的那样,ActionBar有可能在被延迟操作隐藏之前被看到。 实际上是这样的。 大多数情况下,没有任何东西可以看到,但有一段时间,你可以看到ActionBar闪烁一秒钟。

无论如何,这不是一个漂亮的解决scheme,所以我欢迎任何build议。

除了 v7支持的actionbar用户,代码将会是:

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

如果您使用的是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> 

在.class文件中使用这个简单的代码来隐藏操作栏

 getSupportActionBar().hide(); 

创build两种风格:

 <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:隐藏操作栏,同时查看加载

嗨,我有一个简单的解决scheme,使用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); ........... ........... } 

我也试图隐藏在Android 2.2的行动酒吧,但这些解决scheme都没有工作。 一切都以崩溃结束。 我检查了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" ,最后得到我想要的。

之后当我在开发者网站上search“AppCompat”时, 我得到了这个。

所以我认为Android 2.2的解决scheme是

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

对不起,我的英语好像总是。

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

当然,如果你想要的话,你可以添加内容到飞溅活动,但在我的情况下,我只是想直接显示应用程序。

performance:

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

}

如果你使用一个Activity包含一个启animation面,那么你可以使用SherlockActionBar来做到这一点

 getSupportActionBar().hide(); 

启animation面后,您可以再次显示它…

 getSupportActionBar().show(); 

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

@Clerics解决scheme的作品。 但是,这似乎也是一些谷歌原生应用程序的问题:谷歌,玩商店,谈话。 还有其他的大型应用程序,如Skype。

编辑 :波纹解决scheme已经给我的问题,对API的actionbarsherlock <4.0,原因是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); 

最好和简单

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

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

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

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

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

并且一旦Splash Activity在主Activity下面完成使用或者什么也没有

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

试试这个,对我有用:

下面摆脱活动的标题栏

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

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

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

干杯

在阅读所有可用选项后,我发现最好的方法是设置没有ActionBar的主题,然后在所有Activity的父级代码中设置MyTheme。

performance:

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

BaseActivity:

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

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

已经发布的解决scheme带来了副作用,第一个.show()调用没有为我的ActionBar制作animation。 我有另一个很好的解决scheme,修复了:

创build一个透明的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)); 

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

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

在您的第一个.show()调用之前设置自定义视图可见:

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

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

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

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

只有在onCreate的参数为null (表示您的活动全新启动,而不是由于configuration更改而重新启动)时,您应该可以这样做。

我仍然有空指针错误,最后它帮助我调用第一个getWindow()。requestFeature(),然后super.onCreate()

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

只需在你的styles.xml中添加这个

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

其实,你可以简单地设置与NoActionBar飞溅Activity ,并设置您的主要activity与行动栏。

我意识到张贴链接不是最好的办法,但我强烈build议你从Google自己阅读以下文档。 这是关于如何控制你的系统用户界面(如操作栏,导航栏等)的官方安卓文档。 不幸的是,这些信息太直接发布了,但是在阅读完这些信息之后,无论您正在开发什么版本,都会明白如何显示和隐藏function,这非常简单!

Incase的链接有变化,它可以在官方的Android文档下find – 培训 – > 入门 – > 用户界面的最佳实践 – > pipe理系统 用户界面

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

在这里输入图像描述

你可以使用这个:

getSupportActionBar().hide(); 如果它不工作尝试这一个:

 getActionBar().hide(); 

如果以上不起作用,请尝试这样:

在你的目录= res / values / style.xml中,打开style.xml – >有属性parent变更为parent="Theme.AppCompat.Light.DarkActionBar"

如果所有这一切都不起作用。 我不知道了。 但对我来说,它的作品。