如何在创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个主题
-
启动屏幕主题(将其添加到清单):
<style name="SplashTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowBackground">@color/red</item> </style>
-
正常主题(通过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理系统 用户界面
你可以使用这个:
getSupportActionBar().hide();
如果它不工作尝试这一个:
getActionBar().hide();
如果以上不起作用,请尝试这样:
在你的目录= res / values / style.xml中,打开style.xml – >有属性parent
变更为parent="Theme.AppCompat.Light.DarkActionBar"
如果所有这一切都不起作用。 我不知道了。 但对我来说,它的作品。