透明状态栏 - Android 4.4 (KitKat) 之前

Posted

技术标签:

【中文标题】透明状态栏 - Android 4.4 (KitKat) 之前【英文标题】:Transparent status bar - before Android 4.4 (KitKat) 【发布时间】:2014-03-18 21:44:35 【问题描述】:

我知道在android 4.4 KitKat (API 19) 中可以使状态栏透明。

但例如,Go Launcher Ex 和其他人可以选择使其透明,而且它也适用于 KitKat 之前的版本,对我来说 (Android 4.3 (Jelly Bean)) 和我的 Android 4.0 (Ice Cream Sandwich) ) 设备。

我不需要 root 或任何特殊权限来使用它。

下载 Go Launcher Ex 并亲自尝试。对我来说,如果我需要 root 也可以。

但是他们是怎么做到的呢? 如何让 Android 的状态栏在 KitKat 之前的设备上半透明?

---澄清事情---

我不是在谈论Action Bar;我的意思是Status Bar(通知栏)!


查看这些示例图片:

(请注意,这取自我的 Stock Galaxy Note 3Android 4.3Go Launcher Ex。)

(同样的事情也适用于我的 Galaxy S2Android 4.0。)

没有透明状态栏:

启用透明状态栏: (我想在 4.4(API 19)之前的设备上实现这一点)

【问题讨论】:

您能提供一张您想要完成的工作的图片吗? @AustynMahoney 当然,我现在添加一个 @AustynMahoney 添加了图片,希望它们有助于识别我的问题 :) @AbdEl-RahmanEl-Tamawy 我认为我的问题并没有那么令人困惑或模棱两可,请重新阅读 - (我想让它透明 - 请参阅我帖子中的第二张图片)跨度> @AustynMahoney 他们不这样做。这样做几乎是不可能的,尽管如此,您可以使用某些系统工具(在开发人员设置中)验证它们未处于全屏模式 【参考方案1】:

我发现了如何在三星和索尼设备上获得透明状态栏 至少运行 Android 4.0。

首先,让我解释一下为什么在大多数设备上无法实现: 从Android官方来看,直到KitKat(4.4)才解决。 但三星和索尼等一些设备制造商已在其专有软件中添加了此选项。

三星使用他们自己的皮肤版本的 Android,称为 TouchWiz,索尼也在使用他们自己的系统。 他们有自己的 View 类实现,带有额外的 SYSTEM_UI_ 标志,允许在 4.4 之前的设备上启用透明状态栏!

但证明这些标志存在并访问它们的唯一方法是使用反射。 这是我的解决方案:


解决视图标志:

int ResolveTransparentStatusBarFlag()

    String[] libs = getPackageManager().getSystemSharedLibraryNames();
    String reflect = null;

    if (libs == null)
        return 0;

    for (String lib : libs)
    
        if (lib.equals("touchwiz"))
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND";
        else if (lib.startsWith("com.sonyericsson.navigationbar"))
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT";
    

    if (reflect == null)
        return 0;

    try
    
        Field field = View.class.getField(reflect);
        if (field.getType() == Integer.TYPE)
            return field.getInt(null);
    
    catch (Exception e)
    
    

    return 0;

将其应用于您的WindowdecorView(在任何活动中):

void ApplyTransparentStatusBar()

    Window window = getWindow();
    if (window != null)
    
        View decor = window.getDecorView();
        if (decor != null)
            decor.setSystemUiVisibility(ResolveTransparentStatusBarFlag());
    

我认为可能还有其他设备制造商已经实施了这样的标志 但我只能弄清楚这两个(因为我拥有三星和索尼设备)

【讨论】:

不错的发现。你是怎么想出来的? 我反编译了具有该功能的三星和索尼的启动器,我发现这些标志是存在的 我猜你除了(或代替)三星和索尼启动器之外,还反编译了 Nova Launcher……你不需要搜索系统库,只需使用反射来测试这两个标志因为通过 PackageManager 的调用往往很慢(getSystemSharedLibraryNames),所以会更直接并且可能更快。 然而,Google Play 版设备将具有 View SYSTEM UI 标志,但它们不会执行任何操作。这些设备将没有共享库。 Nova 检查库以在不受支持的设备上禁用该选项。 谢谢,我去看看 nova 看看能不能得到答案【参考方案2】:

使用这个。 :)

在 super() 之后和设置内容之前。

if (Build.VERSION.SDK_INT >= 19)

    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);


if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21)

    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);


if (Build.VERSION.SDK_INT >= 21)

    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
    getWindow().setStatusBarColor(Color.TRANSPARENT);



public static void setWindowFlag(Activity activity, final int bits, boolean state)

    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();

    if (state)
     
        winParams.flags |= bits;
    
     else
     
        winParams.flags &= ~bits;
    

【讨论】:

为我工作

以上是关于透明状态栏 - Android 4.4 (KitKat) 之前的主要内容,如果未能解决你的问题,请参考以下文章

利用 Android 4.4 KitKat 中的半透明状态栏

利用 Android 4.4 KitKat 中的半透明状态栏

android 4.4 的标签和半透明状态栏/导航出现问题

Android 4.4 — 半透明状态/导航栏 — fitSystemWindows/clipToPadding 不能通过片段事务工作

Android Kitkat 4.4版本状态栏下使用导航抽屉时状态栏颜色显示为白色不透明

Android 沉浸式/透明式状态栏、导航栏