为什么我们不能用一个半透明的系统吧和ActionBar

在将我的应用程序更新到Kitkat的同时,我只是希望在使用半透明属性的KitKat上给他们一个美丽的外观:

半透明的系统条

现在,您可以使用新主题Theme.Holo.NoActionBar.TranslucentDecor和Theme.Holo.Light.NoActionBar.TranslucentDecor使系统条部分半透明。 通过启用半透明的系统栏,您的布局将填充系统栏后面的区域,所以您还必须启用[fitsSystemWindows] [4]来为布局中不应该被系统栏覆盖的部分。

我唯一担心的是,我想使用一个ActionBar,这听起来与Google想要的相反(两个主题都有NoActionBar:

Theme.Holo.NoActionBar.TranslucentDecor Theme.Holo.Light.NoActionBar.TranslucentDecor 

由于我不打算使用一些黑客或技巧来使其工作,我只是想知道是否有一些正确的方法来实现这一点,或者如果这是违反谷歌准则。

在这里输入图像说明

你可以使用android.R.attr#windowTranslucentStatus创build自己的主题设置为true以达到相同的效果,而不会丢失ActionBar

从文档

指示此窗口是否请求半透明状态栏的标志。 对应于{@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS}。

风格 – 请记住,这些将在values-v19

 <style name="TranslucentStatusBar" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/TranslucentActionBar</item> <item name="android:windowTranslucentNavigation">false</item> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowContentOverlay">@null</item> </style> <style name="TranslucentActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">@android:color/transparent</item> </style> 

布局

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_dark" android:fitsSystemWindows="true" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_purple" /> </FrameLayout> 

结果

在这里输入图像说明

这适用于较less的行:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window w = getWindow(); // in Activity's onCreate() for instance w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } 

如果有人可以添加,如果半透明的导航是可用的,将是很好的,因为N10例如将有半透明导航禁用Build.VERSION_CODES.KITKAT。 编辑:在这个问题上回答: 检查半透明导航是否可用

下面的代码适用于我的应用程序。

半透明:

 Window w = getWindow(); w.setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); w.setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

设置不透明:

 final WindowManager.LayoutParams attrs = getWindow() .getAttributes(); attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().setAttributes(attrs); getWindow().clearFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 

这是我正在寻找的答案: https : //github.com/jgilfelt/SystemBarTint

Android 4.4(KitKat)为状态和导航栏引入了半透明的系统UI样式。 这些样式对于主屏幕启动器等基于壁纸的活动非常适用,但是提供的最小背景保护使得它们对于其他types的活动不那么有用,除非在布局中提供自己的背景。 确定给定设备configuration的系统UI的大小,位置和存在可能是不重要的。

这个库提供了一个简单的方法来创build系统栏的背景“色调”,无论是颜色值还是可绘制的。 默认情况下,它会给你一个半透明的黑色背景,对于持久系统界面依然很重要的全屏内容屏幕非常有用 – 比如放置在地图或照片网格上。

在这里输入图像说明

所有的答案以编程方式或从布局扩展ActionBar:这意味着,当应用程序启动或重新创build时,系统将寻找主题(这是不知道修复),并显示一个非常可怕的状态栏颜色无论是窗口背景…!

我已经创build了一个如何使用主题的例子:

https://github.com/Takhion/android-extendedactionbar

我希望这将是有用的人:)