35

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

半透明系统条

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

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

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

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

在此处输入图像描述

4

5 回答 5

48

android.R.attr#windowTranslucentStatus您可以使用设置创建自己的主题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>

结果

在此处输入图像描述

于 2013-11-03T00:15:33.703 回答
40

这适用于更少的行:

    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 禁用半透明导航。编辑:在这个问题中回答: 检查半透明导航是否可用

于 2013-11-05T15:41:30.333 回答
29

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

半透明:

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);
于 2014-01-15T11:07:40.923 回答
17

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

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

这个库提供了一种为系统栏创建背景“色调”的简单方法,无论是颜色值还是 Drawable。默认情况下,它将为您提供半透明的黑色背景,这对于持久系统 UI 仍然很重要的全出血内容屏幕非常有用 - 例如放置在地图或照片网格上时。

在此处输入图像描述

于 2013-11-18T20:16:39.173 回答
4

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

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

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

我希望它对某人有用:)

于 2014-01-30T23:23:54.837 回答