Lollipop: рисовать позади statusBar с его цветом, установленным на прозрачный

Я установил цвет statusBar прозрачным для Lollipop только со следующей строкой в ​​моей теме:

@android:color/transparent 

Теперь мне нужно потянуться за ним, но я не могу получить ни одного взгляда за ним. Я знаю, как это сделать с свойством windowTranslucentStatus , но не хочу использовать это свойство, так как оно будет игнорировать цвет элемента statusBar, который будет прозрачным.

13 Solutions collect form web for “Lollipop: рисовать позади statusBar с его цветом, установленным на прозрачный”

Способ №1:

Чтобы достичь полностью прозрачной строки состояния, вам необходимо использовать statusBarColor , который доступен только по API 21 и выше. windowTranslucentStatus доступен по API 19 и выше, но добавляет тонированный фон для строки состояния. Тем не менее, установка windowTranslucentStatus действительно делает одну вещь, которая не меняет statusBarColor на прозрачность: она устанавливает флаги SYSTEM_UI_FLAG_LAYOUT_STABLE и SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN . Самый простой способ получить тот же эффект – это вручную установить эти флаги, что эффективно отключает вставки, наложенные системой компоновки Android, и оставляет вас на произвол судьбы.

Вы вызываете эту строку в методе onCreate :

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

Обязательно также установите прозрачность в /res/values-v21/styles.xml:

 @android:color/transparent 

Или программно настроить прозрачность:

 getWindow().setStatusBarColor(Color.TRANSPARENT); 

Хорошая сторона этого подхода заключается в том, что те же макеты и проекты также могут использоваться на API 19, выставляя прозрачную строку состояния для тонированной полупрозрачной строки состояния.

 true 

Способ № 2:

Если вам нужно только нарисовать фоновое изображение в строке состояния, вместо того, чтобы позиционировать представление позади него, это можно сделать, просто установив фон темы вашего мероприятия на нужное изображение и установив прозрачность строки состояния, как показано в методе # 1. Это был метод, который я использовал для создания скриншотов для статьи полиции Android из нескольких месяцев назад.

Способ № 3:

Если вам нужно игнорировать стандартные системные вставки для некоторых макетов, сохраняя при этом их работу в других, единственный жизнеспособный способ сделать это – работать с часто связанным classом ScrimInsetsFrameLayout . Конечно, некоторые вещи, сделанные в этом classе, не нужны для всех сценариев. Например, если вы не планируете использовать наложение синтетической строки состояния, просто закомментируйте все в методе init() и не добавляйте ничего в файл attrs.xml. Я видел, как работает этот подход, но я думаю, вы обнаружите, что это приносит некоторые другие последствия, которые могут быть очень полезными для работы.

Я также видел, что вы против упаковки нескольких макетов. В случае обертывания одного макета внутри другого, где оба имеют match_parent по высоте и ширине, последствия производительности слишком тривиальны, чтобы беспокоиться. Несмотря на это, вы можете полностью избежать этой ситуации, изменив class, который он расширяет с FrameLayout на любой другой class FrameLayout classа Layout. Все будет хорошо.

Это сработало для моего случая


 // Create/Set toolbar as actionbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // Check if the version of Android is Lollipop or higher if (Build.VERSION.SDK_INT >= 21) { // Set the status bar to dark-semi-transparentish getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Set paddingTop of toolbar to height of status bar. // Fixes statusbar covers toolbar issue toolbar.setPadding(0, getStatusBarHeight(), 0, 0); } 

 // A method to find height of the status bar public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 

Дополнительные сведения о работе со статусом: youtube.com/watch?v=_mGDMVRO3iE


Попробуйте эту тему

  

Убедитесь, что ваш макет установлен

 android:fitsSystemWindows="false" 

Вместо

 @android:color/transparent 

Используйте следующее:

 true 

И не забудьте удалить верхнюю прокладку (которая добавляется по умолчанию) на макете «MainActivity».

Обратите внимание, что это не делает панель состояния полностью прозрачной, и на вашей строке состояния по-прежнему будет «выцветший черный» наложение.

Решение от Cody Toombs почти помогло мне. Я не уверен, связано ли это с Xamarin или нет, но теперь у меня есть приемлемое решение:

пример

Это моя настройка:

У меня есть проект Android, на котором я ссылался на пакеты Android.Support v4 и v7. У меня есть два стиля:

Значения / styles.xml:

 < ?xml version="1.0" encoding="UTF-8" ?>    

Значения-V21 / styles.xml:

 < ?xml version="1.0" encoding="UTF-8" ?>    

AndroidManifest нацеливает «MyStyle»:

AndroidManifest.xml:

 < ?xml version="1.0" encoding="utf-8"?>      

И, наконец, код в Основной деятельности:

 [Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity { protected override void OnCreate (Bundle savedInstanceState) { base.OnCreate (savedInstanceState); SetContentView (Resource.Layout.Main); //Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay. var uiOptions = (int)Window.DecorView.SystemUiVisibility; uiOptions ^= (int)SystemUiFlags.LayoutStable; uiOptions ^= (int)SystemUiFlags.LayoutFullscreen; Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions; Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); } } 

Обратите внимание, что я установил флаг DrawsSystemBarBackgrounds, это делает всю разницу

 Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); 

Я потратил много времени на правильное решение, слишком много времени. Надеюсь, этот ответ поможет любому, кто пытается достичь того же.

Вы можете использовать ScrimInsetFrameLayout

https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java

android: fitsSystemWindows = “true” должен быть установлен на компоновке scrim!

Подобно некоторым из размещенных решений, но в моем случае я сделал прозрачную строку состояния и зафиксировал положение панели действий с некоторым отрицательным запасом

 if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor(Color.TRANSPARENT); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams(); lp.setMargins(0, -getStatusBarHeight(), 0, 0); } 

И я использовал в панели инструментов и корневом представлении

 android:fitsSystemWindows="true" 

У меня была такая же проблема, поэтому я создаю ImageView, который заходит за панель состояния API 19+

Установить пользовательский образ за панель состояния gist.github.com

 public static void setTransparent(Activity activity, int imageRes) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return; } // set flags if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } else { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } // get root content of system window //ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); // rootView.setFitsSystemWindows(true); // rootView.setClipToPadding(true); ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (contentView.getChildCount() > 1) { contentView.removeViewAt(1); } // get status bar height int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android"); int height = 0; if (res != 0) height = activity.getResources().getDimensionPixelSize(res); // create new imageview and set resource id ImageView image = new ImageView(activity); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); image.setLayoutParams(params); image.setImageResource(imageRes); image.setScaleType(ScaleType.MATRIX); // add image view to content view contentView.addView(image); // rootView.setFitsSystemWindows(true); } 

Ответ @Cody Toombs приводит к проблеме, которая приносит макет за панель навигации. Итак, я нашел это решение, данное @Kriti

здесь приведен fragment кода Котлина для него:

 if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) { setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true) } if (Build.VERSION.SDK_INT >= 19) { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN } if (Build.VERSION.SDK_INT >= 21) { setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false) getWindow().setStatusBarColor(Color.TRANSPARENT) } private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) { val win: Window = activity.getWindow() val winParams: WindowManager.LayoutParams = win.getAttributes() if (on) { winParams.flags = winParams.flags or bits } else { winParams.flags = winParams.flags and bits.inv() } win.setAttributes(winParams) } 

Вы также должны добавить

 android:fitsSystemWindows="false" 

корневой вид вашего макета.

С Android Studio 1.4 проект шаблона с кодовым табличковым кодом накладывает тему Overlay на панель AppbarLayout и / или панель инструментов. Они также должны отображаться за строкой состояния с fitSystemWindow атрибута fitSystemWindow = true. Это приведет к тому, что панель инструментов будет отображаться непосредственно под панелью состояния, а все остальное будет отображаться под панелью инструментов. Поэтому приведенные выше решения не будут работать самостоятельно. Вам нужно будет внести следующие изменения.

  • Удалите тему Overlay или измените ее на тему без наложения для панели инструментов.
  • Поместите следующий код в свой файл styles-21.xml .

    @android: Цвет / прозрачный

  • Назначьте эту тему активности, содержащей ящик навигации в файле AndroidManifest.xml .

Это заставит ящик навигации отображать за прозрачной панелью состояния.

Существует хорошая библиотека StatusBarUtil из @laobie, которая помогает легко нарисовать изображение в StatusBar.

Просто добавьте в свой build.gradle :

 compile 'com.jaeger.statusbarutil:library:1.4.0' 

Затем в наборе действий

 StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View viewNeedOffset) 

В макете

 < ?xml version="1.0" encoding="utf-8"?>        

Для получения дополнительной информации загрузите демо или клон с страницы github и поиграйте со всеми функциями.

Примечание: Поддержка KitKat и выше.

Надеюсь, что это поможет кому-то еще!

Вот тема, которую я использую для этого:

  

Правильное решение состоит в том, чтобы изменить свойство в XML под тегом Activity ниже в стиле. Он просто работает

  android:theme="@style/Theme.AppCompat.Light.NoActionBar" 
Interesting Posts

Блокировка Chromium – Selective Cookie не работает

Существуют ли какие-либо различия между окончательными и проектными спецификациями 802.11n?

Как создать случайный номер int в C #?

Linux снимок экрана, который сохраняет снимки напрямую, не запрашивая имя файла

Доступен ли Workbook.FileFormat для пользовательского интерфейса Excel (в частности, когда тип файла не может быть сохранен)

Surround в Windows 7 с Soundmax

Формула Excel для сравнения одного значения в одной ячейке с несколькими значениями в другой ячейке

Ноутбук Windows 7 продолжает входить в спящий режим, даже несмотря на то, что настройки питания никогда не повторяются

Купить версию старой версии Windows и получить бесплатную версию?

Пересылка звука, подобного X в SSH

text-overflow: многоточие в Firefox 4? (и FF5)

Могу ли я использовать установочный носитель Windows 10, созданный Media Creation Tool для установки на другом компьютере

Что такое «Магический пакет» для пробуждения компьютера?

Ивритские письма, отображаемые в квадратах в еврейском шрифте в Chrome на Mac OS X 10.10.5 (Yosemite)

Как настроить Windows на виртуальной машине с помощью Powershell (Hyper-V)

Давайте будем гением компьютера.