改变安卓的状态栏的方法,网上的教程打印出来估计都能绕地球一圈,看起来真是心累,个人就喜欢简洁的style,我们很多的使用场景都仅仅是在4.4以上的版本上可以改变状态栏的颜色或者是把布局填充到状态栏里面去,并不是每个人都要仔细钻研5.0和改进,6.0的新API,所以下面介绍一种简洁的方式来搞定状态栏,这种方式在4.4以上的显示效果都是一样的,没有根据5.0去做进一步的处理。
核心的代码很简单,无非是theme里要noTitle,在setContentView之前要给Window设置透明状态栏,然后给最外层的View的顶部画上一个View当做状态栏即可。
下面分三步说明:
- 1.AppTheme:要继承自
Theme.AppCompat.Light.NoActionBar
,或者是没有Title和ActionBar的主题:
- 2.设置透明状态栏:
//如果版本在4.4及其以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
这一步做完,界面是这样的:
- 3.如果你需要状态栏的话,就在最外层的View的顶部加上一个View当做状态栏:
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)) {
//状态栏View
View statusBarView = new View(this);
//获得状态栏的高度
int statusBarHeight = getStatusBarHeight(this);
//设置状态栏View的一些属性,这里的LayoutParams是根据实际的Layout写的
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, statusBarHeight);
params.gravity = Gravity.TOP;
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
//我这里的最外层的View是一个LinearLayout,所以这样直接add到0位置
parentView.addView(statusBarView, 0);
}
这一步做完,界面是这样的:
贴一个获得状态栏高度的方法:
/**
* 获得状态栏的高度
*/
public static int getStatusBarHeight(Context mContext) {
int result = 0;
int resourceId = mContext.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = mContext.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
上面的第三步不是必须的,因为有的“详情”界面或者是“我的”界面的上方的大图都是填充到状态栏里面的,如下图:
所以,到底填不填充状态栏,要看自己的需求,例如,首页有几个Fragment,前几个都需要状态栏,最后一个不需要状态栏,那我们就需要把填充状态栏的工作下放到Fragment里面,Activity里面就不要显示状态栏了。下面贴一点在BaseActivity和BaseFragment里简要的封装的步骤:
- 在BaseActivity里面,写一个方法,用来控制子Activity是否显示状态栏:
/**
* 返回是否需要状态栏,默认返回需要
*/
public void isNeedStatusBar(){
return true;
}
在BaseActivity的填充状态栏的时候判断一下这个方法的返回值,子类如果不需要状态栏就重写这个方法来返回false,这样在改造项目的时候不用动什么大动作。
- 在BaseFragment里面也增加一个方法,同样用来控制子Fragment是否显示状态栏,默认返回的是false,因为Fragment肯定一般不需要状态栏的。在onCreateView的return之前,做一个判断,如果这个方法返回了true,就在最外层的View的顶部加一个状态栏View:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//最外层的View
LinearLayout view = (LinearLayout) inflater.inflate(R.layout.fg_base,null);
//其他初始化操作
//.......
//如果需要状态栏,就添加一个状态栏在顶部
if((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) && isAddStatus()){
View statusBarView = new View(getActivity());
int statusBarHeight = ((BaseActivity)getActivity()).getStatusBarHeight(getActivity());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, statusBarHeight);
params.gravity = Gravity.TOP;
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
//同样的,我这里最外层是LinearLayout,如果是其他的布局,那就自己想办法了
view.addView(statusBarView,0);
}
return view;
}
这样,最最简单的封装就完成了,所有的Activity都默认加状态栏,如果不想加就在子Activity重写isNeedStatusBar()方法返回false;所有Fragment都默认不加状态栏,如果想加就在子Fragment重写isNeedStatusBar()方法返回true。用在我这里就是:主页MainActivity包含四个Fragment,所以MainActivity不需要状态栏,MainActivity重写isNeedStatusBar()方法返回false;前三个Fragment需要状态栏,第四个Fragment不需要状态栏,那么只需要在第四个Fragment重写isNeedStatusBar()方法返回true即可,That’s all。
本人水平不高,就想用最简单的方式来做东西,本人有分享的精神,但是本人不想误人子弟,所以如果哪位看到了本文的错误,一定要留言提出来,不胜感激!