Android,如何正确地创build一个透明的状态栏

我试图让Android 4.4+上的透明状态栏我知道如何通过定义自己的风格使其透明:

<style name="Theme.MyTheme" parent="Theme.MyTheme.Base"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> </style> 

我在这里find: https : //stackoverflow.com/a/20573595/2633630

问题是,当状态栏是透明的,它不符合操作栏的颜色,并看到后台的活动: 透明状态栏错误

所以我发现我可以在我的布局中使用android:fitsSystemWindows =“true”和android:clipToPadding =“false” http://mindofaandroiddev.wordpress.com/2013/12/28/making-the-status -bar-和导航条透明上带有一个-列表视图-ON-机器人-4-4-奇巧/

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background_darkRed" android:fitsSystemWindows="true" android:clipToPadding="false" tools:context="com.sandak......."> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> .... 

这解决了最重要的问题,透明的状态栏,看起来不错。不幸的是,在系统button的“导航栏”底部有问题,这是红色的,不透明,我希望: 在这里输入图像说明

我正在尝试所有可能的变体来达到工作效果,但我无法弄清楚如何解决这个问题。 我唯一的工作解决scheme是设置顶部填充大约60dp的根元素。 但是这个解决scheme是丑陋的,在不同的设备上可能看起来不一样,可能不起作用。

我在Google Play上发现了几个可以透明背景的应用程序,所以我很好奇他们是如何使它工作的。

例如: https : //play.google.com/store/apps/details?id =com.trello和其他几个

//更新:
好的,这是相当古老的答案。 现在你可以使用Material主题来处理这个,这很容易。 只要设置目标API为21+,如果需要使用支持库,并创build主题与材料主题,您可以直接指定状态栏颜色

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- colorPrimary is used for the default action bar background --> <item name="colorPrimary">@color/color_primary</item> <!-- colorPrimaryDark is used for the status bar --> <item name="colorPrimaryDark">@color/color_primary_dark</item> <!-- colorAccent is used as the default value for colorControlActivated which is used to tint widgets --> <item name="colorAccent">@color/accent_orange</item> </style> 

================================================== =====================

老解答:

好的,看来我解决了我的问题。 这不是最好,最明确的解决scheme,但它是工作的解决scheme。 如果将来有人会find更好更清晰的解决scheme,请让我知道,我会更新我的答案/或者将您的答案标记为正确答案。 但是现在,我没有比这个小黑客更好的解决办法了:

布局的根元素必须是RelativeLayout。 比应该按照你的主要布局,像ScrollView或任何其他types的布局,没关系。 在结束之前,相对布局标签之后的结尾是空的LinearLayout,它已经设置了与您的Action Bar相同的背景和固定的高度(状态栏的高度)。

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.sandak...."> <ScrollView android:fitsSystemWindows="true" android:clipToPadding="false" android:layout_width="match_parent" android:layout_height="match_parent"> .... all your main views etc.. </ScrollView> <LinearLayout android:id="@+id/statusBarBackgroundLinearLayout" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="30dp" android:background="@color/background_darkRed" android:clickable="false" android:focusable="false"> </LinearLayout> </RelativeLayout> 

那么你必须在代码中设置与状态栏一样的线性布局高度:

 private void setStatusBarBackground(View rootView) { setStatusBarLayout(rootView); statusBarHeight = getStatusBarHeight(); setStatusBarLayoutHeight(statusBarHeight); } private void setStatusBarLayout(View rootView){ statusBarBackgroundLinearLayout = (LinearLayout) rootView.findViewById(R.id.statusBarBackgroundLinearLayout); if (isPreKitkatDevice()) { hideStatusBarLayout(); } } private int getStatusBarHeight() { int statusBarHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = getResources().getDimensionPixelSize(resourceId); } return statusBarHeight; } private boolean isPreKitkatDevice(){ return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT; } private void hideStatusBarLayout(){ statusBarBackgroundLinearLayout.setVisibility(View.INVISIBLE); } private void setStatusBarLayoutHeight(int height){ RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) statusBarBackgroundLinearLayout.getLayoutParams(); layoutParams.height = height; } 

然后在你的onCreate()方法中调用setStatusBarBackground。 这是所有不同types设备的工作解决scheme。 对于不允许透明背景的预装KitKat设备,您必须隐藏线性布局。