显示状态和导航栏后面的内容

Vai*_*ari 7 android navigationbar android-statusbar

这看起来像一个重复的问题,但我无法做到.我想要完整的透明(不是半透明)状态栏以及导航栏,并希望内容显示在它们后面.

activity_details.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary"
    tools:context="com.bitspilanidvm.bosm2017.DetailsActivity">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/q"
    android:scaleType="centerCrop"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

v21 styles.xml

<resources>

<!-- Theme for API level > 21 -->
<style name="AppTheme" parent="AppBaseTheme">
     <!--Customize your theme here. -->
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:navigationBarColor">@android:color/transparent</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在活动java文件中

getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
               View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        );
Run Code Online (Sandbox Code Playgroud)

这就是我得到的.

在此输入图像描述

如何获取导航栏后面的内容?

如果我加

<item name="android:windowTranslucentNavigation">true</item>
Run Code Online (Sandbox Code Playgroud)

到我的styles.xml

这是我得到的

在此输入图像描述

正如您所看到的,内容位于导航栏后面,但导航栏必须是半透明的.

这有什么解决方案吗?

Abh*_*bhi 17

FLAG_LAYOUT_NO_LIMITS在窗口中添加标志.这适用于Android KitKat及以上的API.这样的例子是这样的:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window window = getWindow(); 
     window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }
Run Code Online (Sandbox Code Playgroud)

之所以FLAG_FULLSCREEN不起作用,只是因为FULLSCREEN标志用于删除屏幕装饰,如状态栏(适用于您).但导航栏不是屏幕装饰.该LAYOUT_NO_LIMIT标志允许窗口超出屏幕限制,因此导航栏也会被覆盖在此标志内.

您也可以通过在沉浸式模式下设置应用程序来隐藏导航和状态栏.

编辑 API ViewCompat.setOnApplyWindowInsetListener解决了android:fitsSystemWindows=”true”不能和窗口插入可以应用于特定视图的问题.这方面的一个例子.

ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> {
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
    params.topMargin = insets.getSystemWindowInsetTop();
    return insets.consumeSystemWindowInsets();
});
Run Code Online (Sandbox Code Playgroud)

标准布局一样FrameLayout,LinearLayout或RelativeLayout不会通过窗口插图他们的孩子,而材料的布局会做(例如DrawerLayout,CoordinatorLayout).因此,我们可以将布局更改为任何材质,或者我们可以将标准布局子类化,并将插图传递给布局的子项.我们只需要覆盖onApplyWindowInsets方法.

@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
    int childCount = getChildCount();
    for (int index = 0; index < childCount; ++index)
        getChildAt(index).dispatchApplyWindowInsets(insets); 
        // let children know about WindowInsets

    return insets;
}
Run Code Online (Sandbox Code Playgroud)

参考文档:OnApplyWindowInsetsListener,WindowInsets


Vah*_*n84 8

我想评论已接受的答案,但我还不能。

只是为了警告所有会采取这种方法的人

FLAG_LAYOUT_NO_LIMITS 允许将您的根视图扩展到屏幕边界之外,从而创建有关布局设计的其他问题。例如,这个标志通过强制系统忽略“adjustPan”和“adjustResize”标志来简单地破坏表单可读性

因此,即使我仍然认为 Ahbi 的答案是正确的,请确保没有超出此标志范围的任何内容

更好的解决方案:

实际上,我刚刚找到了一种更好的方法来实现相同的结果,而不会破坏任何东西

这是我的样式文件

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:navigationBarColor">@android:color/transparent</item>

</style>
Run Code Online (Sandbox Code Playgroud)

这些是我以编程方式设置的标志

w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
Run Code Online (Sandbox Code Playgroud)

设置标志 LAYOUT_HIDE_NAVIGATION(与样式项结合)起到了作用,我的表单仍然对 adjustPan 标志做出反应