如何在系统栏下绘制带有视图的布局?

时间:2018-09-07 08:51:15

标签: android android-layout kotlin

我必须进行布局,其中布局的顶部应绘制在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
    }

这是应用程序中的结果:

enter image description here

我需要在系统栏下方绘制该灰色区域。

更新

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

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

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

    }

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

enter image description here

4 个答案:

答案 0 :(得分:1)

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

urlfile = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'

答案 1 :(得分:0)

在您的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)
    }

答案 2 :(得分:0)

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

CASE WHEN B = 0 THEN NULL ELSE 100.0*A/B END 

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

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

通常不可能肯定在kitkitt之前执行此操作,看起来您可以执行此操作,但是有些奇怪的代码可以做到这一点。

编辑:我建议使用此lib:https://github.com/jgilfelt/SystemBarTint进行很多棒棒糖状态前的颜色控制。

经过深思熟虑,我了解到完全禁用半透明性或棒棒糖状态栏和导航栏上放置的任何颜色的答案是在窗口上设置此标志:

android:fitsSystemWindows="true"

答案 3 :(得分:0)

How about this:

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);
    }

This should make Only StatusBar transparent.


If this didn't help, try adding:

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

To the Activity styles code in styles.xml.