在我的主题中,我定义了以下规则来在状态栏后面绘制我的观点:
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
在活动中(onCreate):
getWindow.getDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
)
然后,在我的View中使用Barcodescanner,它应该在状态栏后面绘制,这是有效的。但是,当我将android:fitsSystemWindows
应用于任何子视图时,他们都无法调整其位置。但是,当我将它应用于根元素时,它正在工作。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<my.Scanner
android:id="@+id/scanner"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"> <!-- Should receive a top padding, right? -->
<View android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/red" />
</FrameLayout>
</FrameLayout>
答案 0 :(得分:17)
使用CoordinatorLayout作为视图的root用户,它对我有用。
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
答案 1 :(得分:13)
我的问题很可能与多个/嵌套fitsSystemWindows
属性有关,这些属性不能像我后面发现的那样起作用。我通过将属性应用于一个视图解决了我的问题,然后通过ViewTreeObserver.OnGlobalLayoutListener
将填充复制到需要它们的其他视图。这是一个丑陋的黑客,但现在它的工作。
答案 2 :(得分:2)
我在Android 4.4中遇到了同样的问题
我的问题是<item name="android:windowTranslucentStatus">true</item>
与<item name="android:fitsSystemWindows">true</item>
我的方式是删除
<item name="android:windowTranslucentStatus">true</item>
答案 3 :(得分:1)
有一个简单的方法可以做到这一点。确保您设置了应用于活动的主题样式中的2个元素。
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
....
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="android:fitsSystemWindows">true</item>
...
</style>
无需在布局中添加android:fitsSystemWindows
。这将直接添加到其中。
答案 4 :(得分:0)
对我来说,问题是小键盘隐藏了位于活动末尾的editText字段。.我尝试了所有解决方案,但没有任何效果。
在调用setContentView()
方法之前,我一直在使用以下代码来使状态栏透明:
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);
}
我删除了它,还删除了android:windowSoftInputMode="adjustResize|adjustPan" from the maneifest
文件,现在它可以工作了。
答案 5 :(得分:0)
我在6.0棉花糖上遇到了同样的问题。
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
为我工作。 下面是我的样式表。希望这会成功。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>
</style>
答案 6 :(得分:0)
进行此更改
1. Manifest - create a theme and add window background of your like
2. toolbar in xml - add the same background in toolbar
这对我有用。