Android透明状态栏和操作栏
我已经做了一些关于这个主题的研究,我找不到一个完整的解决scheme,所以,一步一步地尝试和错误,我终于find了如何实现这些结果:有一个透明或彩色的Actionbar
和Statusbar
。 看到我的答案吼叫。
我正在开发一个应用程序,当涉及到操作栏和状态栏定制时,需要在所有设备中看起来类似于> = 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); }
注意:这是一个扩展了ActionBarActivity
的abstract 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); }