Android 为什么可以';我们使用半透明的系统栏和ActionBar

Android 为什么可以';我们使用半透明的系统栏和ActionBar,android,android-actionbar,android-4.4-kitkat,Android,Android Actionbar,Android 4.4 Kitkat,在将我的应用程序更新到Kitkat时,我只想使用半透明属性在Kitkat上给它们一个华丽的外观: 半透明系统栏 现在,您可以使用新主题(Theme.Holo.NoActionBar.半透明装饰和Theme.Holo.Light.NoActionBar.半透明装饰)使系统栏部分半透明。通过启用半透明系统栏,您的布局将填充系统栏后面的区域,因此您还必须为布局中不应被系统栏覆盖的部分启用[fitsSystemWindows][4] 我唯一担心的是,我想使用一个ActionBar,它听起来与Google

在将我的应用程序更新到Kitkat时,我只想使用半透明属性在Kitkat上给它们一个华丽的外观:

半透明系统栏

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

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

Theme.Holo.NoActionBar.TranslucentDecor 
Theme.Holo.Light.NoActionBar.TranslucentDecor 
由于我不打算使用一些黑客或技巧来让它工作,我只是想知道是否有一些正确的方法来实现这一点,或者这是否会违反谷歌的指导方针


您可以使用
android.R.attr#windowTranslucentStatus
设置为
true
来创建自己的主题,以在不丢失
操作栏的情况下实现相同的效果

从文档中

指示此窗口是否请求半透明状态栏的标志。 对应 到{@link android.view.WindowManager.LayoutParams#FLAG_transparent_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>

@样式/半透明操作栏
假的
真的
@空的
@android:彩色/透明
布局

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

结果


这适用于较少的行:

    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_code.KITKAT禁用半透明导航。 编辑:回答此问题:
这是我一直在寻找的答案:

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

该库提供了一种简单的方法来为背景创建“色调” 系统栏,无论是颜色值还是可绘制的。默认情况下,它将给出 您可以使用半透明的黑色背景,这将有助于完全出血 内容屏幕,其中持久化系统UI仍然很重要-如 当放置在地图或照片栅格上时


下面的代码在我的应用程序中运行良好

半透明的:

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);
设置为非半透明:

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

所有答案都以编程方式或布局方式扩展了ActionBar:这意味着,当应用程序启动或重新创建时,系统将查找主题(不知道修复),并显示一个非常难看的状态栏,其颜色与窗口背景相同

我创建了一个仅使用主题的示例:


我希望它对某些人有用:)

此解决方案会遇到一些透支问题。。如果我找到了一个奇特的方法来解决这个问题,我会在评论中添加信息!谢谢你的回答这很酷。但我遇到了一些碎片问题。我所有的活动都在寻找,但我的片段占用了很多空间。不知道为什么,因为活动工作正常。如果我将windowTranslucentNavigation设置为true,导航栏将为蓝色。有没有办法将第二个框架布局移到导航栏后面,使其变成紫色?问题也一样。。如何为状态栏添加与ActionBart相同的颜色谢谢!!这是我一直在努力解决的问题!欢迎您回答我的问题:为什么不简单地
getWindow().clearFlags(WindowManager.LayoutParams.FLAG\u半透明\u导航)删除半透明导航条?