Android开发中对于状态栏你会怎么处理?
本文宗旨:让大家都能会Android开发,让Android开发更简单,针对Android的状态栏,做了给种不同的适配,从此远离状态栏实配的烦恼。
在以前的Android版本中,许多Android一提起状态栏,沉浸式就头疼,搞个状态栏,像是在做系统一样,后来随着Android版本的更新迭代,状态栏迎来了新的曙光。
静态进行状态栏的修改
在res目录下的styles.xml添加如下配置
//沉浸状态栏
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowTranslucentStatus">true</item>
<!--//ActionBarDrawerToggle设置颜色-->
<!--<item name="colorControlNormal">@android:color/white</item>-->
<!--//兼容版本的沉浸式状态栏-->
<!--<item name="android:windowTranslucentStatus">false</item>-->
<!--<item name="android:windowTranslucentNavigation">true</item>-->
<!--<item name="android:statusBarColor">@android:color/transparent</item>-->
这种方法可以满足大多数人的需求,但想要做的更好,我们一般选择动态进行修改。
动态进行修改状态栏
方法一:在setcontentview之前设置flag
-
etWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
方法二:在任何位置都可以添加和移除一个flag
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) //隐藏状态栏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) //显示状态栏
方法三:通过view设置setsystemUiVisibility,参数有一下几种,可单独设置也可多个设置
View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。 View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。 View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。 View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
使用实例
// //布局填充状态栏,设置透明
// if (Build.VERSION.SDK_INT >= 21) {
// View decorView = getWindow().getDecorView();
// int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
// decorView.setSystemUiVisibility(option);
// getWindow().setStatusBarColor(Color.TRANSPARENT);//透明状态栏
// }
// //隐藏状态栏和导航栏,但是一点击就显示出来了
// if (Build.VERSION.SDK_INT >= 21) {
// View decorView = getWindow().getDecorView();
// int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_FULLSCREEN;
// decorView.setSystemUiVisibility(option);
// }
// //布局填充状态栏,导航栏,设置全部透明
// if (Build.VERSION.SDK_INT >= 21) {
// View decorView = getWindow().getDecorView();
// int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
// decorView.setSystemUiVisibility(option);
// getWindow().setNavigationBarColor(Color.TRANSPARENT);
// getWindow().setStatusBarColor(Color.TRANSPARENT);
// }
//全屏显示,拉出状态栏和导航栏后一会后消失。
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
应用场景:横竖屏切换的时候显示和隐藏状态栏
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//竖屏
// getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //显示状态栏
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);//全部显示出来。
} else {
//横屏
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //隐藏状态栏
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
判断虚拟按键是否显示和隐藏:
Rect r = new Rect();
/**
* decorView是window中的最顶层view,可以从window中通过getDecorView获取到decorView。
* 通过decorView获取到程序显示的区域,包括标题栏,但不包括状态栏。
*/
mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//获取屏幕的高度
int screenHeight = mActivity.getWindow().getDecorView().getRootView().getHeight();
if(screenHeight>r.bottom && !tag){//显示虚拟按键;
softInputHeight = screenHeight - r.bottom-getSoftButtonsBarHeight(mActivity);
}else if(screenHeight>=r.bottom){//隐藏虚拟按键
tag=true;
softInputHeight = screenHeight - r.bottom;
}
LogX.e("屏幕:"+screenHeight+"-----"+r.bottom);
//计算软件盘的高度
LogX.e("虚拟按键的高度:"+getSoftButtonsBarHeight(mActivity));
关于状态栏就简单的说到这里,但是由于Android三方不同厂商的定制,适配也不一样,这是令人头疼的一个问题,对于小米和魅族这两种特别机型的适配,给出了如下方案。点击进入