我试图在状态栏和导航栏下绘制内容,它们是完全透明的,同时也利用了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"的行为吗?谢谢。
使用国旗
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”;但它不起作用。有人说,我应该删除导航栏并将其嵌入导航控制器中,但由于我的