【问题标题】:android Q content above navigation bar导航栏上方的android Q内容
【发布时间】:2019-09-04 08:45:37
【问题描述】:

我们将我们的应用程序定位在 api 28 并在状态栏下绘制内容。为此,我们使用以下标志和样式:

window.addFlags(FLAG_LAYOUT_NO_LIMITS)

<item name="windowNoTitle">true</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>

在 Android Pie 上一切正常(状态栏下方和导航栏上方的内容布局)。在android Q中,导航栏是半透明的,并显示在应用程序内容之上

【问题讨论】:

  • 你想隐藏导航栏吗?
  • 隐藏或保留旧版本(集中在导航栏上方)

标签: android android-layout android-styles navigationbar android-10.0


【解决方案1】:

“问题”是 FLAG_LAYOUT_NO_LIMITS 行为的基础,与 api 29 中的新手势功能混合

https://medium.com/androiddevelopers/gesture-navigation-going-edge-to-edge-812f62e4e83e https://medium.com/androiddevelopers/gesture-navigation-handling-visual-overlaps-4aed565c134c

一个小解决办法是:

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
window.statusBarColor = Color.TRANSPARENT

不要设置

android:fitsSystemWindows
android:windowTranslucentStatus
android:windowIsTranslucent

【讨论】:

  • 在 Android 29 中还是一样
  • 最重要的,不要设置getWindow().setFlags(FLAG_LAYOUT_NO_LIMITS, FLAG_LAYOUT_NO_LIMITS);
【解决方案2】:

在 android api 29 中,底栏与内容重叠。

在您的活动中添加此代码

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


    ViewCompat.setOnApplyWindowInsetsListener(getWindow().getDecorView(), new OnApplyWindowInsetsListener() {
        @Override
        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
            v.setPadding(0, 0, 0, v.getPaddingBottom() + insets.getSystemWindowInsetBottom());
            return insets;
        }
    });

【讨论】:

  • 这对我在 Android 12 上运行很有用。稍微修改了 kotlin 解决方案以替换已弃用的“insets.getSystemWindowInsetBottom()”:ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { v, insets -> val systemBarInsets = insets .getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(0, 0, 0, systemBarInsets.bottom) insets }
【解决方案3】:

你应该把这个交给你的主要活动

    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

然后为 v29 创建一个新的 styles.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <!-- values-v29/themes.xml -->
  <style name="AppTheme"
      parent="Theme.AppCompat.Light">
      <item name="android:navigationBarColor">
          @android:color/black
      </item>

      <!-- Optional, if drawing behind the status bar too -->
      <item name="android:statusBarColor">
          @android:color/black
      </item>
  </style>
</resources>

来源: https://medium.com/androiddevelopers/gesture-navigation-going-edge-to-edge-812f62e4e83e

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 2015-08-27
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多