当前位置: 首页 > 知识库问答 >
问题:

在状态栏和导航栏下绘制内容,同时保持fitsSystemWindows=“true”行为

彭允晨
2023-03-14

我试图在状态栏和导航栏下绘制内容,它们是完全透明的,同时也利用了fitsSystemWindows="true"

对于状态栏,fitsystemwindows=“true”以及以下代码可以正常工作。

getWindow() .getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getWindow().setStatusBarColor(Color.TRANSPARENT);

然而,当我在导航栏下添加以下线条来绘制内容时,我们从fitsystemwindows=“true”获得的插图将不再可用。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

一些解决方案包括像这样获得状态栏和导航栏高度

getResources().getDimensionPixelSize(getResources().getIdentifier("status_bar_height", "dimen", "android"));

并将其用作填充物。

然而,这种方法是不被鼓励的。

在状态栏和导航栏下绘制内容时,有什么方法可以保持fitsSystemWindows="true"的行为吗?谢谢。

共有1个答案

梁晋鹏
2023-03-14

使用国旗

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window w = getWindow();
            w.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            w.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
           w.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

        }

然后用这两种方法推送你的视图

@SuppressLint("NewApi")
public static boolean hasImmersive(Context ctx) {

    if (!cached) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            hasImmersive = false;
            cached = true;
            return false;
        }
        Display d = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

        DisplayMetrics realDisplayMetrics = new DisplayMetrics();
        d.getRealMetrics(realDisplayMetrics);

        int realHeight = realDisplayMetrics.heightPixels;
        int realWidth = realDisplayMetrics.widthPixels;

        DisplayMetrics displayMetrics = new DisplayMetrics();
        d.getMetrics(displayMetrics);

        int displayHeight = displayMetrics.heightPixels;
        int displayWidth = displayMetrics.widthPixels;

        hasImmersive = (realWidth > displayWidth) || (realHeight > displayHeight);
        cached = true;
    }

    return hasImmersive;
}

相应地使用填充物

 if (hasImmersive(this)) {
            yourView.setPadding(0, 0, 0, getSoftButtonsBarHeight());

        }

并获得系统软按钮的高度

 @SuppressLint("NewApi")
    private int getSoftButtonsBarHeight() {
        // getRealMetrics is only available with API 17 and +
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int usableHeight = metrics.heightPixels;
            getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
            int realHeight = metrics.heightPixels;
            if (realHeight > usableHeight)
                return realHeight - usableHeight;
            else
                return 0;
        }
        return 0;
    }

编辑:要保留通知栏的fitsystemwindows=“true”行为,请在将窗口插入应用于视图后添加标志_布局_无限制和其他标志,该视图已将fitsystemwindows设置为true。这将确保在应用无限制标志之前,插图已正常应用。

yourViewWithFitsSystemWindows.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
        @Override
        public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
            if(insets.getSystemWindowInsetTop() == 0) return insets; // This is needed.
            v.onApplyWindowInsets(insets);

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            // add other flags
            return insets;
        }
    });

这与设置底部填充一起,给出了所需的结果。

 类似资料:
  • 但是像App Store里一样透明模糊但是有背景色,问题是导航控制器的背景色不像正常的那样在状态栏下。 我的代码: 编辑:我有一个自定义类和视图控制器嵌入在一个 Swift 3,Xcode 8.0 beta 5。

  • 只有在第一次打开应用程序时,半透明的状态栏才会出现问题。请看屏幕截图: http://i1335.photobucket.com/albums/w673/ductruongcntt/Screenshot_2014-06-26-14-17-26_zps1e9a56f4.png 以下是我使用的样式的XML,其中包括半透明状态栏: 我的主题是:

  • 我正在将我的应用程序迁移到iOS 7。为了处理状态栏问题,我添加了以下代码 这在正常情况下工作正常。如果我正在更改方向(应用程序仅支持横向方向)或显示任何视图控制器并取消模型视图控制器,则我的视图控制器对齐方式将更改。状态栏再次与我的视图控制器重叠。这段代码根本不起作用。请指导我解决此状态栏问题。 案例2:这就是我展示视图控制器的方式 裁判: 提前谢谢。

  • 我想制作一个完全透明的状态栏和导航栏,就像Google Play那样。当我使用窗口设置来实现它时,键盘会覆盖编辑文本。 当此代码使用键盘输入覆盖的编辑文本时: 此外,该代码并没有使其完全透明,它只是使其半透明 还是这个

  • 我已经谷歌了几个小时,尝试了无数的东西,但我就是不能让这个工作... 这是: 这是: 这几乎和我预期的一样…唯一的问题是调用填充整个屏幕(减去状态/导航栏)将状态栏颜色更改为黑色。当我关闭对话框时,它会变回。 如果我删除了行,状态栏将保留,但对话框大小将是默认值(屏幕中间的一个小正方形)。 在我调用< code>window.setLayout(...),我试着把下面的代码: 这会将状态栏颜色设置

  • 我的应用程序中有一个视图控制器,它在情节提要中拖动了一个导航栏。它在iOS 6中运行良好,但在iOS 7中看起来是这样的: 状态栏和导航栏不应相互碰撞。我在堆栈溢出上看到了很多这样的问题,但它们对我没有多大帮助。 有些问题说我应该使用这个“self.edgesForExtendedLayout=UIRectEdgeNone”;但它不起作用。有人说,我应该删除导航栏并将其嵌入导航控制器中,但由于我的