Прозрачная строка состояния - до Android 4.4 (KitKat)

Я знаю, что в Android 4.4 KitKat (API 19) возможно сделать строку состояния прозрачной.

Но, например, Go Launcher Ex и другие имеют возможность сделать его прозрачным, и он также работает на pre KitKat, для меня ( Android 4.3 (Jelly Bean)) и на моем устройстве Android 4.0 (Ice Cream Sandwich).

Мне не нужны были права root или какие-либо особые привилегии для его использования.

Скачайте Go Launcher Ex и попробуйте сами. Для меня было бы также хорошо, если бы мне нужен root.

Но как они это сделали? Как сделать строку состояния Android полупрозрачной на устройствах до KitKat?

--- чтобы уточнить вещи ---

Я не говорю о панели действий; Я имею в виду строку состояния (панель уведомлений)!


посмотрите эти примеры изображений:

(Обратите внимание, это взято из моей Stock Galaxy Note 3 с Android 4.3 и Go Launcher Ex.)

(То же самое работает с моей Galaxy S2 и Android 4.0 тоже.)

Без прозрачной строки состояния:

Без прозрачной панели (по умолчанию

С включенной прозрачной строкой состояния: (Я хочу добиться этого на устройствах до 4.4 (API 19))

С прозрачной строкой состояния (чего я хочу добиться на устройствах до 4.4 любым способом

2 ответа

Решение

Я обнаружил, как получить прозрачную строку состояния на устройствах Samsung и Sony
работает как минимум Android 4.0.

Для начала позвольте мне объяснить, почему это невозможно на большинстве устройств:
С официальной стороны Android нет решения до KitKat (4.4).
Но некоторые производители устройств, такие как Samsung и Sony, добавили эту опцию в свое проприетарное программное обеспечение.

Samsung использует свою собственную версию Android под названием TouchWiz, а 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;
}

Примените это на decorView вашей Window (внутри любой деятельности):

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

Я думаю, что, возможно, есть другие производители устройств, которые внедрили такой флаг
но мне удалось выяснить это только два (потому что у меня есть устройство Samsung и Sony)

Использовать этот.:)

после 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;
    }
}
Другие вопросы по тегам