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
我想评论已接受的答案,但我还不能。
只是为了警告所有会采取这种方法的人
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 标志做出反应
| 归档时间: |
|
| 查看次数: |
4869 次 |
| 最近记录: |