Android Полностью прозрачная панель состояния?

Я искал документацию, но нашел это только: Link . Используется для того, чтобы сделать брусок полупрозрачным . То, что я пытаюсь сделать, – сделать панель состояния полностью прозрачной (как показано на рисунке ниже) и сделать ее обратной совместимостью для APK <19: введите описание изображения здесь

Мои стили.xml:

Что я мог сделать:

введите описание изображения здесь

Все, что вам нужно сделать, это установить эти свойства в своей теме:

 true true 

Для вашего вида деятельности / контейнера, для которого требуется прозрачная строка состояния, требуется следующее свойство:

 android:fitsSystemWindows="true" 

Как правило, это невозможно сделать на pre-kitkat, похоже, что вы можете это сделать, но какой-то странный код делает это так .

EDIT: Я бы порекомендовал эту библиотеку lib: https://github.com/jgilfelt/SystemBarTint для многократного контроля цвета строки состояния до леллипопа.

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

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window w = getWindow(); // in Activity's onCreate() for instance w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } 

Никакая другая тема не нужна, она производит что-то вроде этого:

введите описание изображения здесь

Просто добавьте эту строку кода в свой основной файл java:

 getWindow().setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS ); 

use android: fitsSystemWindows = “false” в вашем верхнем макете

Вы можете использовать внешнюю библиотеку StatusBarUtil :

Добавьте к своему модулю build.gradle :

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

Затем вы можете использовать следующую утилиту для Activity, чтобы сделать строку состояния прозрачной:

 StatusBarUtil.setTransparent(Activity activity) 

Пример:

прозрачная строка состояния на Lollipop и KitKat

Неважно, что я нашел здесь ответ: полностью прозрачная строка состояния и панель навигации на леденец

Надеюсь, это поможет кому-то :).

Теперь мне нужно только сделать его обратно совместимым.

используя этот код в ur xml, вы сможете увидеть временную шкалу в работе ur:

  

Чтобы нарисовать ваш макет в строке состояния:

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

 true 

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

 true @color/colorPrimaryDark 

Используйте CoordinatorLayout / DrawerLayout, которые уже позаботились о параметре fitsSystemWindows или создали свой собственный макет так:

 public class FitsSystemWindowConstraintLayout extends ConstraintLayout { private Drawable mStatusBarBackground; private boolean mDrawStatusBarBackground; private WindowInsetsCompat mLastInsets; private Map childsMargins = new HashMap<>(); public FitsSystemWindowConstraintLayout(Context context) { this(context, null); } public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); if (ViewCompat.getFitsSystemWindows(this)) { ViewCompat.setOnApplyWindowInsetsListener(this, new android.support.v4.view.OnApplyWindowInsetsListener() { @Override public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) { FitsSystemWindowConstraintLayout layout = (FitsSystemWindowConstraintLayout) view; layout.setChildInsets(insets, insets.getSystemWindowInsetTop() > 0); return insets.consumeSystemWindowInsets(); } }); setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); TypedArray typedArray = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimaryDark}); try { mStatusBarBackground = typedArray.getDrawable(0); } finally { typedArray.recycle(); } } else { mStatusBarBackground = null; } } public void setChildInsets(WindowInsetsCompat insets, boolean draw) { mLastInsets = insets; mDrawStatusBarBackground = draw; setWillNotDraw(!draw && getBackground() == null); for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); if (child.getVisibility() != GONE) { if (ViewCompat.getFitsSystemWindows(this)) { ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) child.getLayoutParams(); if (ViewCompat.getFitsSystemWindows(child)) { ViewCompat.dispatchApplyWindowInsets(child, insets); } else { int[] childMargins = childsMargins.get(child); if (childMargins == null) { childMargins = new int[]{layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, layoutParams.bottomMargin}; childsMargins.put(child, childMargins); } if (layoutParams.leftToLeft == LayoutParams.PARENT_ID) { layoutParams.leftMargin = childMargins[0] + insets.getSystemWindowInsetLeft(); } if (layoutParams.topToTop == LayoutParams.PARENT_ID) { layoutParams.topMargin = childMargins[1] + insets.getSystemWindowInsetTop(); } if (layoutParams.rightToRight == LayoutParams.PARENT_ID) { layoutParams.rightMargin = childMargins[2] + insets.getSystemWindowInsetRight(); } if (layoutParams.bottomToBottom == LayoutParams.PARENT_ID) { layoutParams.bottomMargin = childMargins[3] + insets.getSystemWindowInsetBottom(); } } } } } requestLayout(); } public void setStatusBarBackground(Drawable bg) { mStatusBarBackground = bg; invalidate(); } public Drawable getStatusBarBackgroundDrawable() { return mStatusBarBackground; } public void setStatusBarBackground(int resId) { mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null; invalidate(); } public void setStatusBarBackgroundColor(@ColorInt int color) { mStatusBarBackground = new ColorDrawable(color); invalidate(); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); if (mDrawStatusBarBackground && mStatusBarBackground != null) { int inset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0; if (inset > 0) { mStatusBarBackground.setBounds(0, 0, getWidth(), inset); mStatusBarBackground.draw(canvas); } } } } 

main_activity.xml

        

Результат:

Скриншот

android:fitsSystemWindows="true" работает только с v21. Мы можем установить его в теме xml или в родительском макете, LinearLayout как LinearLayout или в CoordinateLayout . Для ниже v21 мы не смогли добавить этот флаг. Создайте папку с различными значениями с различным файлом style.xml в соответствии с вашими потребностями.

  @android:color/transparent  

Не используйте для использования windowLightStatusBar вместо statusBarColor = @android:color/transparent

Это только для уровня API> = 21. Это работает для меня. Вот мой код (Котлин)

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById(android.R.id.content).systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE } 
  • Android реагирует на URL в намерении
  • Android: Как получить уровень сигнала GSM для всех доступных сетевых операторов
  • Отслеживание продолжительности звонка
  • findViewById () возвращает null для настраиваемого компонента в макете XML, а не для других компонентов
  • Разница между размером андроида: pt и dp
  • Как преобразовать виды в растровые изображения?
  • Как resize пользовательского представления программно?
  • Как создать представление, которое больше экрана?
  • Расчет пересечений между сегментами линии
  • 3D-карусель в Android
  • Устройства Android с разной высотой принимают ту же папку макета
  • Давайте будем гением компьютера.