最近在接手一个项目,须要在旧的代码基础上添加沉浸式通知栏。所以这段时间专门研究了一下网上已有的例子,发现不太适用当前项目,主要缘由是当前项目不一样的页面顶部标题栏的颜色不同,特别是我的中心页面能够切换皮肤,而网上的例子大 部分没考虑到这种状况。通过多方面考虑,决定本身动手写。 java
所谓的沉浸式通知栏就是把用来导航的各类界面操做空间隐藏在以程序内容为主的情景中,经过相对“隐形”的界面来达到把用户可视范围最大化地用到内容自己上。而最新安卓4.4系统的通知栏沉浸模式就是在软件打开的时候通知栏和软件顶部颜色融为一体,这样不只可使软件和系统自己更加融为一体。(以下图所示)android
具体实现方式以下:app
1.新建个公共style,设置android:fitsSystemWindows=trueide
<!-- 设置应用布局时是否考虑系统窗口布局;true --> <style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar"> <item name="android:fitsSystemWindows">true</item> </style>
2. 修改AndroidManifest.xml,让全部的activity样式默认设置为AppBaseTheme(*不一样项目要灵活处理,笔者项目的activity样式都是统一的因此这样设置没问题,可是实际状况下不一样的activity可能调用的样式不同,须要读者自行按本身的项目来设置)布局
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppBaseTheme" android:name="****">
3.新增沉浸式通知栏实现类,实现原理很简单。ui
1)判断当前系统版本是否是4.4以上,判断代码以下:this
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) spa
2)若是大于4.4则设置状态栏透明化,代码以下:code
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); xml
3)获取activity的根rootView(DecorView),而后建立一个新的view stateBarView并把它添加到rootView(这里手动给它设置个ID,下次进来时先判断rootView是否已建立stateBarView,若是已建立则直接获取该View这样能够防止重复建立,致使内存泄露)
如下是具体代码实现
import android.annotation.SuppressLint; import android.app.Activity; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout.LayoutParams; /** * 沉浸式通知栏公共类 * @author hurrican * */ @SuppressLint({ "InlinedApi", "ResourceAsColor" }) public class ImmersedNotificationBar { private Activity activity ; //设置沉浸式通知栏的ID(防止重复建立) private final static int IMMERSED_NOTIFICATION_BAR_ID = 12345678 ; private final static String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height" ; public ImmersedNotificationBar(Activity activity){ this.activity = activity ; } //获取状态栏高度 private int getStatusBarHeight(Resources res){ int statusBarHeight = 0; int resourceId = res.getIdentifier(STATUS_BAR_HEIGHT_RES_NAME, "dimen", "android"); if (resourceId > 0) { statusBarHeight = res.getDimensionPixelSize(resourceId); } return statusBarHeight ; } //添加顶部状态栏 private View addStateBar(Activity activity,ViewGroup rootView,int statusBarHeight){ //建立新的View,并添加到rootView顶部) View statusBarView ; if(null!=rootView.findViewById(IMMERSED_NOTIFICATION_BAR_ID)){ statusBarView = rootView.findViewById(IMMERSED_NOTIFICATION_BAR_ID); }else{ statusBarView = new View(activity); rootView.addView(statusBarView); } statusBarView.setId(IMMERSED_NOTIFICATION_BAR_ID) ; LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,statusBarHeight); params.gravity = Gravity.TOP; statusBarView.setLayoutParams(params); statusBarView.setVisibility(View.VISIBLE); return statusBarView ; } /** * 设置状态栏颜色 * @param ColorId */ public void setStateBarColor(int ColorId){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) window.getDecorView(); //透明化状态栏 window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); Resources res = activity.getResources(); //获取状态栏目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarView.setBackgroundColor(ColorId) ; } } /** * 设置状态栏颜色 * @param ColorId */ public void setStateBarDrawable(Drawable drawable){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) window.getDecorView(); //透明化状态栏 window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); Resources res = activity.getResources(); //获取状态栏目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarView.setBackgroundDrawable(drawable) ; } } }
使用方法很简单,在onCreate方法里面建立一个ImmersedNotificationBar对象,而后调用setStateBarColor或setStateBarDrawable方法,由于本人的项目每一个页面顶部颜色不一致,因此本人是在onResume方法中设置状态栏颜色,如下是本人项目中的代码,仅供参考
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.context = this ; initView(); notificationBar = new ImmersedNotificationBar(this) ; } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); notificationBar.setStateBarColor(this.getResources().getColor(R.color.red)) ; }
*文笔很差,有看不明白的能够留言也能够发送问题到我邮箱,共同探讨,共同进步。本人的邮箱地址是: hurrican_ok@126.com 正常状况下本人一周至少会登录一次。若是不能及时回复请见谅