Android透明状态栏和操作栏

我已经做了一些关于这个主题的研究,我找不到一个完整的解决scheme,所以,一步一步地尝试和错误,我终于find了如何实现这些结果:有一个透明或彩色的ActionbarStatusbar 。 看到我的答案吼叫。

我正在开发一个应用程序,当涉及到操作栏和状态栏定制时,需要在所有设备中看起来类似于> = API14。 我终于find了一个解决scheme,因为它花了我一点时间,我会分享它来拯救你的一些。 我们从使用appcompat-21依赖开始。

透明的Actionbar

values / styles.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light"> ... </style> <style name="AppTheme.ActionBar.Transparent" parent="AppTheme"> <item name="android:windowContentOverlay">@null</item> <item name="windowActionBarOverlay">true</item> <item name="colorPrimary">@android:color/transparent</item> </style> <style name="AppTheme.ActionBar" parent="AppTheme"> <item name="windowActionBarOverlay">false</item> <item name="colorPrimary">@color/default_yellow</item> </style> 

values-v21 / styles.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light"> ... </style> <style name="AppTheme.ActionBar.Transparent" parent="AppTheme"> <item name="colorPrimary">@android:color/transparent</item> </style> <style name="AppTheme.ActionBar" parent="AppTheme"> <item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item> <item name="colorPrimary">@color/default_yellow</item> </style> 

现在,您可以在您的AndroidManifest.xml使用这些主题来指定哪些活动将具有透明或彩色的ActionBar

  <activity android:name=".MyTransparentActionbarActivity" android:theme="@style/AppTheme.ActionBar.Transparent"/> <activity android:name=".MyColoredActionbarActivity" android:theme="@style/AppTheme.ActionBar"/> 

在这里输入图像描述在这里输入图像描述在这里输入图像描述在这里输入图像描述在这里输入图像描述

注意:在API> = 21中,操作Statusbar透明的, Actionbar你需要获得Statusbar透明度,否则将不会尊重你的颜色风格,并保持浅灰色。

透明状态栏(仅适用于API> = 19)
这一个非常简单,只需使用下面的代码:

 protected void setStatusBarTranslucent(boolean makeTranslucent) { if (makeTranslucent) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } 

但是你会注意到一个时髦的结果: 在这里输入图像描述

发生这种情况是因为当Statusbar是透明的时,布局将使用其高度。 为了防止这个,我们只需要:

解答一:
在您的布局视图容器中添加以下行android:fitsSystemWindows="true"您可以在下面放置任何操作栏:

  ... <LinearLayout android:fitsSystemWindows="true" android:layout_width="match_parent" android:layout_height="match_parent"> ... </LinearLayout> ... 

解决办法二:
添加几行到我们以前的方法:

 protected void setStatusBarTranslucent(boolean makeTranslucent) { View v = findViewById(R.id.bellow_actionbar); if (v != null) { int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0; TypedValue tv = new TypedValue(); getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true); paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics()); v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0); } if (makeTranslucent) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } 

其中R.id.bellow_actionbar将是布局容器视图的ID,无论我们想放置在下面的操作Actionbar

 ... <LinearLayout android:id="@+id/bellow_actionbar" android:layout_width="match_parent" android:layout_height="match_parent"> ... </LinearLayout> ... 

在这里输入图像描述

所以就是这样,它认为我不会忘记什么。 在这个例子中,我没有使用Toolbar但我认为它会有相同的结果。 这是我如何自定义我的操作Actionbar

 @Override protected void onCreate(Bundle savedInstanceState) { View vg = getActionBarView(); getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(getContentView()); if (vg != null) { getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(false); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayUseLogoEnabled(false); } setStatusBarTranslucent(true); } 

注意:这是一个扩展了ActionBarActivityabstract class
希望它有帮助!

它支持KITKAT之后。 只需在您的Activity的onCreate方法中添加以下代码。 无需对Manifest文件进行任何修改。

  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); }