【问题标题】:How to draw layout with views under system bars?如何在系统栏下使用视图绘制布局?
【发布时间】:2018-09-19 19:58:35
【问题描述】:

我必须进行布局,布局的顶部应该在SystemBars 下绘制。 (此应用的最低 API 级别为 22)

我设置了这些标志来实现这一点。在其他活动中,我可以使用SystemBars 下的视图绘制整个片段,但这里我不能这样做。

我使用此代码允许在SystemBars 下绘制布局

window.apply {
        addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        statusBarColor = resources.getColor(android.R.color.transparent)
        navigationBarColor = resources.getColor(android.R.color.transparent)
        setBackgroundDrawable(background)
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }

这是应用中的结果:

我需要在系统栏下画出那个灰色区域。

更新:

@Redman 解决方案仅部分起作用。 现在我可以在StatusBar 下绘图,也可以在软件按钮 (navigationButtons) 下绘图,如下面的屏幕所示。有什么方法可以让布局在SystemBars 下绘制,但不允许在navigationButtons 下绘制?因为我发布的代码适用于应用程序中的不同片段。但在其他片段中,我没有ImageView 作为ToolBar 的一部分。如果你只有ToolBar,例如2色渐变背景和一些backButton + SearchView,它工作正常。但是当我添加ImageView 时,ImageView 不会在顶部SystemBar(aka StatusBar) 下“滑动”。即使在上图中,您也可以清楚地看到绿色(它是在StatusBar 下绘制的工具栏背景)。但是ImageView是不允许画在那个栏下面的。

实现这一目标的唯一方法是使用那行特殊的代码

window.apply { 
        setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

    }

但这一行也允许在NavigationButtons 下绘制布局内容(这是一个问题)。

【问题讨论】:

标签: android android-layout kotlin


【解决方案1】:

在您的Activity 主题中添加这些属性

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

并在父布局中添加属性

 android:fitsSystemWindows="true"

编辑

尝试以编程方式执行此操作,它应该可以在具有 kitkat 及更高版本的设备上运行

    window.apply { 
        setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
    }

【讨论】:

  • truetrue 我无法将其添加到样式中。它会使我的系统栏变暗。我需要它完全透明。我将添加到父布局背景的内容,也应该是系统栏的背景。 fitSystemWindows="true" 将使整个布局适合底部系统栏按钮(如果您有软件按钮)。这些按钮将被我的布局覆盖。
  • 这在状态栏上正常工作,但导航栏坏了。如果屏幕底部有软件按钮,我的整个布局都会绘制在这些按钮上。我想保持按钮完整,布局应该只绘制在状态栏上。
【解决方案2】:

在您的 xml 文件中使用工具栏视图。见下例

    <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="@dimen/height_50dp"
            android:background="#f1f1f1">

\\define your any element here. Like back arrow or title

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

【讨论】:

  • 整个标题位于工具栏布局内。内部工具栏布局是 CoordinatorLayout,带有 imageViews 和 TextViews + 按钮。
【解决方案3】:

您需要做的就是在您的主题中设置这些属性:

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

您希望拥有透明状态栏的活动/容器布局需要此属性集:

android:fitsSystemWindows="true"

通常不可能在 pre-kitkat 上确定执行此操作,看起来您可以执行此操作,但一些奇怪的代码使其如此。

编辑:我会推荐这个库: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);
        }

【讨论】:

    【解决方案4】:

    这个怎么样:

    Window window = getWindow();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(ContextCompat.getColor(this, R.color.primary_dark));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            int flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            window.addFlags(flags);
        }
    

    这应该使 Only StatusBar 透明。


    如果这没有帮助,请尝试添加:

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

    styles.xml 中的Activity 样式代码。

    【讨论】:

    • 这不起作用。与此处其他解决方案的结果相同
    • 现在呢?我已经使用setStatusBarColor 作为状态栏..它现在应该有帮助
    • 如果我只使用你的代码,它不会在状态栏下绘制工具栏。当我添加 setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) 它将在 statusBar 和 navigationBar 下绘制内容
    • 所以在这种情况下,我相信在样式中添加&lt;item name="android:windowTranslucentStatus"&gt;true&lt;/item&gt; 会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2021-06-24
    • 2016-07-22
    • 2016-10-08
    • 2012-06-25
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多