web-dev-qa-db-ja.com

透明なステータスバー-前Android 4.4(KitKat)

Android 4.4 KitKat(API 19)では、ステータスバーを透明にすることができることを知っています。

しかし、例えば、Go Launcher Exなどには透明にするオプションがあり、私にとっては( Android 4. (Jelly bean))、Android 4.0(アイスクリームサンドイッチ)デバイス。

それを使用するのにルートや特別な特権は必要ありませんでした。

Go Launcher Exをダウンロードして、自分で試してみてください。私にとっては、ルートが必要になっても大丈夫でしょう。

しかし、彼らはどうやってそれをしましたか? KitKat以前のデバイスでAndroidのステータスバーを半透明にするにはどうすればよいですか?

---物事を明確にするために---

アクションバー ;については話していない ステータスバー (通知バー)!


これらのサンプル画像を参照してください。

(注意、これは私のStock Galaxy Note 3Android 4.3およびGo Launcher Ex。)

(同じことが私のGalaxy S2Android 4.0でも機能します。 )

透明なステータスバーなし

Without transparent bar (default)

With透明ステータスバーが有効:(4.4より前(API 19)デバイスでこれを実現したい)

With transparent status bar (what I want to achieve on pre 4.4 devices in any way

26
bricklore

SamsungおよびSonyデバイスで透明なステータスバーを取得する方法を発見しました
少なくともAndroid 4.0。

まず、ほとんどのデバイスでそれができない理由を説明させてください。
Androidの公式側からは、KitKat(4.4)まで解決策はありません。
ただし、SamsungやSonyなどの一部のデバイスメーカーは、独自のソフトウェアにこのオプションを追加しています。

SamsungはTouchWizと呼ばれる独自のスキンバージョンのAndroidを使用し、Sonyは独自のシステムも使用しています。
これらにはViewクラスの独自の実装があり、追加のSYSTEM_UI_ 4.4より前のデバイスで透明なステータスバーを有効にできるフラグ!

ただし、これらのフラグが存在することを証明し、それらのフラグにアクセスする唯一の方法は、Reflectionを使用することです。
これが私の解決策です。


ビューフラグを解決します。

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

decorViewWindow(アクティビティ内)に適用します。

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

このようなフラグを実装している他のデバイスメーカーがあると思います
しかし、私はこの2つしか理解できませんでした(SamsungとSonyのデバイスを所有しているため)

20
bricklore

これを使って。 :)

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;
    }
}
2
Ali Bagheri