Прозрачная строка состояния - до 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))
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;
}
}