透明状态栏无法使用windowTranslucentNavigation =“false”

时间:2015-02-03 00:41:39

标签: android android-layout android-appcompat android-styles

我正在开发Activity我需要使导航栏不透明,状态栏在运行5.0+(API 21+)的设备上透明。我正在使用的样式如下,以及对我的问题的解释。

AppTheme 延伸 Theme.AppCompat.Light.NoActionBar

<item name="android:statusBarColor">@color/transparent</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/welbe_red_transparent</item>

FullscreenTheme 延伸 AppTheme

<item name="android:windowNoTitle">true</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:windowTranslucentNavigation">true</item>

这使应用看起来像这样

android:windowTranslucentNavigation="true"

如果我删除android:windowTranslucentNavigation样式,或将其设置为false中的Fullscreen,则会修复导航栏问题。问题是状态栏变为完全白色而不是保持透明并显示其背后的内容。

android:windowTranslucentNavigation="false"

我尝试在我的布局中使用fitsSystemWindow="true",但它没有解决问题。任何人都知道为什么会这样吗?

5 个答案:

答案 0 :(得分:62)

android:windowTranslucentNavigation执行android:statusBarColor无法执行的任务,即请求SYSTEM_UI_FLAG_LAYOUT_STABLESYSTEM_UI_FLAG_LAYOUT_FULLSCREEN标记。

这些是您需要请求以便在状态栏后面绘制的内容。

onCreate的{​​{1}}中提出申请:

Activity

或者,您也可以简单地设置应用主题背景,并且也会弹出状态栏。

更多信息here

答案 1 :(得分:5)

据我所知,没有正确的方法可以在低于19的API上设置状态栏的颜色。

对于API 19+,您只能为状态栏使用与windowTranslucentNavigation类似的属性:

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

备注:

  • 您获得白色状态栏的原因是

    <item name="android:statusBarColor">@color/transparent</item> 
    
  • some hacks可用于特定的制造商设备,但我不会自己使用它们。

答案 2 :(得分:2)

我挣扎了3个多小时。在CoordinatorLayout中包装所有内容,它是唯一一个似乎关注fitSystemWindow =&#34; true&#34;或&#34; false&#34;

这是我的主要活动片段

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/layout_google_map"/>

    <include layout="@layout/layout_toolbar_transparent"/>

    <include layout="@layout/layout_action_buttons"/>

    <include layout="@layout/layout_bottom_sheet"/>

</android.support.design.widget.CoordinatorLayout>

这是我的工具栏布局

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:theme="@style/ToolbarTheme"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <android.support.v7.widget.AppCompatImageView
            android:layout_width="wrap_content"
            android:layout_height="?actionBarSize"
            android:layout_centerHorizontal="true"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            app:srcCompat="@drawable/ic_fynd_logo_red"/>

    </android.support.v7.widget.Toolbar>
</android.support.design.widget.CoordinatorLayout>

如您所见,我的片段布局使得谷歌地图可以在状态栏下绘制。

我有一个公司标志所在的操作栏。

和其他ui按钮&#34; layout_action_buttons&#34;也包含在协调器布局中,因此fitsSystemsWindows可以工作。

检查出来。

enter image description here

答案 3 :(得分:0)

enter image description here

要在任何活动中实现这一目标

  1. 添加样式:
 <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                <item name="colorPrimary">@color/colorPrimary</item>
                <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
                <item name="colorAccent">@color/colorAccent</item>
                <item name="android:statusBarColor">@android:color/transparent</item>
                <item name="android:windowBackground">@android:color/white</item>
            </style>
  1. 使用CoordinatorLayout作为XML的根布局

  2. 在oncreate()方法中,使用setcontentview之前

    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE或View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

答案 4 :(得分:0)

对于最新的 android 版本 R 和向后兼容性,这对我有用。

WindowCompat.getInsetsController(window, window.decorView)?.isAppearanceLightStatusBars =false /* true for dark icon on StatusBar and false for white icon on StatusBar */
WindowCompat.setDecorFitsSystemWindows(window, false)
WindowCompat.getInsetsController(window, window.decorView)?.show(WindowInsetsCompat.Type.statusBars())
ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { rootView, insets ->
    val navigationBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
    rootView.setPadding(0, 0, 0, navigationBarHeight)
    insets
}

对于片段,您可以使用 activity?.window...