Android Полностью прозрачная панель состояния?
Я искал документацию, но нашел это только: Link . Используется для того, чтобы сделать брусок полупрозрачным . То, что я пытаюсь сделать, – сделать панель состояния полностью прозрачной (как показано на рисунке ниже) и сделать ее обратной совместимостью для APK <19:
Мои стили.xml:
@style/ThemeActionBar true @style/ThemeActionBar true @null @null showHome | useLogo showHome|useLogo
Что я мог сделать:
- MD5 хеширование в Android
- Как настроить пользовательское хранилище ключей для отладки в eclipse для Android
- Как получить текущее время из Интернета в android
- как изменить фоновое изображение кнопки при нажатии / фокусировке?
- Как создать текстовый файл и вставить данные в этот файл на Android
- Если я назову getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0
- Создать папку в Android
- Сборщик мусора в Android
Все, что вам нужно сделать, это установить эти свойства в своей теме:
- 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)
Пример:
Неважно, что я нашел здесь ответ: полностью прозрачная строка состояния и панель навигации на леденец
Надеюсь, это поможет кому-то :).
Теперь мне нужно только сделать его обратно совместимым.
используя этот код в 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 }