android - 如何有一个透明的状态栏但让导航栏不透明?
问题描述
我想在我的应用程序上有一个透明的状态栏(所以背景在它后面),但我希望底部的导航栏保持黑色。
我可以通过设置使两者都透明getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
我可以通过设置使顶部半透明(部分透明)<item name="android:windowTranslucentStatus">true</item>
但是,如果不使底部也透明,我就不能使顶部完全透明。使用<item name="android:statusBarColor">@android:color/transparent</item>
或类似方法不起作用。
有谁知道如何在不影响导航栏的情况下制作一个完全透明的状态栏?
解决方案
要独立控制 KitKat 上状态栏和导航栏的半透明性,您可以简单地使用窗口管理器标志FLAG_TRANSLUSCENT_STATUS
和FLAG_TRANSLUSCENT_NAVIGATION
活动onCreate()
方法。但是,在 KitKat 上,系统可能会在状态栏上绘制可绘制的半透明渐变稀松布。这似乎是特定于设备的:在我的 KitKat 设备上它是完全透明的,但在 Android Studio 模拟器上它显示了一个稀松布。
在 Lolliop 或更高版本上,您可以使用该Window#setStatusBarColor(int)
方法和FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
窗口管理器标志来设置状态栏颜色。请注意,在这种情况下清除FLAG_TRANSLUSCENT_STATUS
标志。如果您希望颜色透明,这意味着您的应用程序支持全屏模式并设置系统 UI 可见性,因此由您的应用程序管理状态栏背景颜色。
将它们放在一起看起来像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(0x00000000); // transparent
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
window.addFlags(flags);
}
setContentView(R.layout.main);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
使用的布局示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="#ff00ff00"
android:fitsSystemWindows="false"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Hello World!"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</LinearLayout>
</RelativeLayout>
示例截图。
棒糖:
奇巧:
推荐阅读
- arduino - 视频 ESP32 上的文本叠加
- r - R隐式分隔符中的换行符吗?
- c# - 为什么我不能将类型“UnityEngine.Vector2”隐式转换为“float”?
- xsl-fo - 如何在 XSL-FO 中的旋转表格单元格中水平对齐文本?
- java - 擦除 - 编译后的通用类型信息
- ansible - Ansible:使用变量构建命令
- perl - 从 Perl 的命令输出中查询第二行
- android - 带有片段导航组件的底部导航视图设置不起作用
- excel - 为什么我的 VBA 代码可以处理我在代码中没有提到的某些文件?
- java - 重绘扩展 JPanel 的类时调用什么 Methode?