Android中的半透明状态栏

Posted

技术标签:

【中文标题】Android中的半透明状态栏【英文标题】:Translucent status bar in Android 【发布时间】:2017-07-07 21:24:16 【问题描述】:

我正在使用以下布局 (main_activity.xml)

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
    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_
    android:layout_
    android:fitsSystemWindows="true">

<android.support.v4.widget.NestedScrollView
    android:layout_
    android:layout_
    android:fitsSystemWindows="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <TextView
        android:layout_
        android:layout_
        android:layout_margin="@dimen/text_margin"
        android:fitsSystemWindows="true"
        android:text="@string/large_text" />
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

具有以下样式-v21

<resources>
<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>

但我仍然无法存档透明状态栏

看起来像这样

但我想要这样的东西(新的 Google 报亭应用)

注意:我正在使用

compile 'com.android.support:appcompat-v7:25.1.1'
compile 'com.android.support:support-v4:25.1.1'
compile 'com.android.support:design:25.1.1'

【问题讨论】:

查看link 【参考方案1】:

试试这个:

将此添加到您的应用主题中:

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

android:fitsSystemWindows=”true” 设置为根容器

现在在您的活动中 onCreate():

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
        Window w = getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    

更新,结果:

您可以让snackbar 在屏幕顶部绘制:

Snackbar snack = Snackbar.make(parentLayout, str, Snackbar.LENGTH_LONG);
View view = snack.getView();
FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
params.gravity = Gravity.TOP;
view.setLayoutParams(params);
snack.show();

更多信息请见here

【讨论】:

我想吻你。非常感谢,完美运行 看看这个答案:***.com/questions/33354791/… 我只希望在一个活动中使用它。我怎样才能实现?【参考方案2】:
@Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Window window = getWindow();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(Color.TRANSPARENT);  


在您的活动中使用它。但是只有在android L之后才允许更改状态栏颜色

【讨论】:

尝试从您正在使用的样式中移除状态栏颜色 已移除,现在是灰色,不透明。 rafsanahmad0007 的解决方案有效,但感谢所有帮助。 好吧,对你有好处..享受。这段代码也可以工作。我测试过,看起来不错 非常感谢你。这是适用于 android 5.0 的唯一答案【参考方案3】:

下面的代码使 API21+ 的状态栏透明但导航栏不透明。

注意:您不应该设置android:fitsSystemWindows="true"

override fun onCreate(savedInstanceState: Bundle?) 
      setupContentWindow()
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)


fun setupContentWindow() 
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.statusBarColor = Color.TRANSPARENT
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

【讨论】:

这很完美,因为它使状态栏透明但导航栏不透明【参考方案4】:

在你希望其布局状态栏透明的Activity的onCreate中添加这两行

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
getWindow().setStatusBarColor(Color.TRANSPARENT);

无需更改您的应用主题或 xml 布局。如果您不想这样做,您的栏不必在整个应用程序中保持透明。

【讨论】:

这是正确答案。所有其他答案都将“透明状态栏”误认为“无状态栏”。 应该像if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.LOLLIPOP) getWindow().setStatusBarColor(Color.TRANSPARENT); 因为setStatusBarColor 需要最低棒棒糖版本【参考方案5】:

似乎有些人的状态栏是灰色而不是透明的。为避免此问题,请在您的活动中执行以下操作:

override fun onCreate(savedInstanceState: Bundle?) 
    ...
    window.apply 
        clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        statusBarColor = Color.TRANSPARENT
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    

【讨论】:

非常感谢!【参考方案6】:

请从您的 CoordinatorLayout 中删除此行:

android:fitsSystemWindows="true"

已编辑, 结果:

【讨论】:

已移除,现在是灰色,但不透明 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 在您的活动中使用上述行。 我不想要全屏,我想要一个透明的状态栏,就像上面(Play Newsstand)的图片

以上是关于Android中的半透明状态栏的主要内容,如果未能解决你的问题,请参考以下文章

利用 Android 4.4 KitKat 中的半透明状态栏

Material Design 中呈现的 Android Lollipop 上的半透明渐变状态栏

iPhone - 应用程序上方的半透明黑色状态栏

Android 4.4 — 半透明状态/导航栏 — fitSystemWindows/clipToPadding 不能通过片段事务工作

防止Safari上的半透明URL和状态栏

iOS 7状态栏半透明,具有向后兼容性