“ android:windowTranslucentNavigation”的异常行为

时间:2019-04-20 10:27:03

标签: android xml android-styles

我首先在当前正在开发的主应用程序中遇到了这种奇怪的行为。为了调试问题,我创建了一个测试应用程序。 测试应用程序只有一个活动 MainActivity ,它扩展了 Activity 。 此活动的主题是在 styles.xml

中声明的 AppTheme.NoActionBar
    <style name="AppTheme">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.NoActionBar" parent="AppTheme.Base">
        <item name="android:statusBarColor">#FFFFFF</item>
        <item name="android:windowTranslucentNavigation">true</item>
    </style>

    <style name="AppTheme.Base" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

由此,输出看起来像这样Image 1 图片1 现在,这不是我所期望的,请查看状态栏和工具栏如何合并在一起。

但是当我删除了这行代码

<item name="android:windowTranslucentNavigation">true</item>

这就是我最终得到的Image 2 请注意,这次工具栏和状态栏未合并,而是将状态栏放置在其下方。 我无法理解如何在状态栏中的图片1 中绘制布局

我知道这个问题会让许多阅读本书的人感到困惑。但是如何添加属性

<item name="android:windowTranslucentNavigation">true</item>

与状态栏无关的

我的测试设备正在android Pie

上运行

1 个答案:

答案 0 :(得分:0)

好的,经过一番研究,我发现

android:windowTranslucentNavigation=true

不仅使导航栏成为半透明,而且还允许布局在状态栏后面绘制绘图。

问题是,如果我们想要一个彩色的导航栏(用于Lollipop及更高版本)而不是半透明的,我们需要删除该行,这样我们将不再能够在状态栏后面绘制。

解决方法:

声明styles.xml(v21)并设置导航栏颜色

<item name="android:navigationBarColor">@color/red</item>

现在,由于此styles.xml文件仅用于API> = 21的设备,因此我们需要确保布局也绘制在API> = 21的状态栏后面,因此,请在活动的在 setContentView

之前 onCreate
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) // Checks the API level of the device
{
    getWindow()
              .getDecorView();
              .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 
                                     View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

结论: 对于设备(API <21), android:windowTranslucentNavigation = true 将使导航栏变为半透明,并且布局将绘制在状态栏后面;对于设备(API> = 21),我们可以修改颜色导航栏而不会破坏用户界面