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

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

    //    for using status bar space
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

проблема в том, что этот код заставляет мой макет активности занимать весь экран, даже пространство с панелью навигации, так как это решить?

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




Ответы (3)


Это решение, которое я использовал для тестирования на Android 10 и других версиях, поэтому проверьте, поможет ли оно.

В своем styles.xml создайте пользовательскую тему, вы можете установить родительскую тему в соответствии с темой вашего приложения, если она имеет какой-либо из NoActionBar (AppCompat/DayNight/material и т. д.), установленный в качестве родительского, или установить его напрямую (поскольку без NoActionBar по умолчанию будет генерироваться сверху), основным требованием являются следующие три строки:

<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:statusBarColor">#00000000</item>
</style>

Вы можете проверить документацию для statusBarColor, если хотите, в основном говорит вам, что нужно сделать.

Цвет строки состояния. Если цвет не непрозрачный, попробуйте установить {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_STABLE} и {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}. Чтобы это вступило в силу, окно должно отображать фон системной панели с помощью {@link android.R.attr#windowDrawsSystemBarBackgrounds}, а строка состояния не должна быть запрошена как полупрозрачная с помощью {@link android.R.attr#windowTranslucentStatus. }. Соответствует {@link android.view.Window#setStatusBarColor(int)}.

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

Теперь в действии создайте этот метод, как показано ниже:

private void showCustomUI() {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }

Это те флаги, которые вам нужны, не добавляйте View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION при установке флагов, так как он скрывает панель навигации, которую вы хотите показать.

Вам нужно будет вызвать метод, иначе строка состояния не будет создана должным образом.

Итак, попробуйте это и дайте мне знать, если это сработало для вас.

РЕДАКТИРОВАТЬ: Не забудьте удалить флаги FLAG_LAYOUT_NO_LIMITS, если они у вас есть, так как это создаст проблемы. Вот что я получил при тестировании Android 10.

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

person ljk    schedule 12.02.2020
comment
это работает нормально, но я использовал родительскую тему, подобную этой ‹style name=CustomTheme parent=Theme.AppCompat.Light.NoActionBar› для работы - person Neo; 13.02.2020
comment
В моем случае AppTheme было установлено на <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">, так что это был тот же случай, поскольку у вас был макет координатора с панелью действий, я предположил, что ваша тема приложения по умолчанию имеет parent="Theme.AppCompat.Light.NoActionBar", но да, вам нужно установить NoActionBar, чтобы он не отображался сверху . Я отредактирую ответ, чтобы устранить путаницу. - person ljk; 13.02.2020
comment
Важное примечание: удалите android:fitsSystemWindows="true" из каждого макета в вашем XML-файле, если он у вас есть. - person Homayoon Ahmadi; 10.04.2021

Способ 1

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

стили.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
</style>

v21\styles.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

строка состояния будет прозрачной или полупрозрачной, панель навигации не будет

если установка windowTranslucentStatus на true не сработает, вы можете попробовать это

Метод 2

стили.xml ; просто измените родителя и не добавляйте windowTranslucentStatus

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

переопределить стиль для v21 и v23

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

и добавьте это в свой activity.class

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

ссылка из ответ1, ответ2< /а>

надеюсь это поможет!

person Rahul Gaur    schedule 11.02.2020
comment
Первый метод работает, но я хочу, чтобы прозрачный цвет был нулевым, как на изображении с вопросами, он дает мне темную прозрачность в строке состояния на Android 10, я попробую его на других версиях Android, чтобы увидеть, что это происходит только на Android 10, на с другой стороны, метод 2 имеет ту же проблему на Android 10, он отлично работает, только если вы используете жесты и удаляете кнопки системной навигации - person Neo; 11.02.2020

Используя эти флаги, вы можете добиться этого.

private void showSystemUI() {

    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

вызвать этот метод.

person RajaReddy PolamReddy    schedule 11.02.2020
comment
это работает, но прозрачный цвет в строке состояния не нулевой, прозрачный, темный, прозрачный на Android 10, попробую на другой версии Android. - person Neo; 11.02.2020