项目开发中,关于Bar 这块儿,经常会出现一些古古怪怪的需求,因此本文在此对Bar的一些常见需求,做一个总结。
需求一、全屏,StatusBar和TitleBar都不保留。
这个需求有一下三种方案来解决:
1、通过Java代码动态解决,在Activity的OnCreate()方法setContentView(R.layout.activity_status_bar)代码之后添加以下代码:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
2、同样是通过Java代码动态解决,用下面的代码替换上面1中的代码:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
3、通过在xml文件中设置主题的方式解决:
先在style文件中编辑主题格式:
<style name="fullScreen" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="android:windowFullscreen">true</item>
</style>
然后再对应的Activity文件清单的注册处添加主题:
<activity
android:theme="@style/fullScreen"
android:name=".statusbar.StatusBarActivity" />
如此同样实现了隐藏StatusBar和TitleBar的目的。效果如下:
需求二、全屏,保留StatusBar,但透明
为了保证效果以及不抛异常,我们向下兼容到SDK版本19,并通过Java代码动态实现:
在Activity的OnCreate()方法setContentView(R.layout.activity_status_bar)代码之后添加以下代码:
Window window = getWindow();
//默认API 最低19
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup contentView = window.getDecorView().findViewById(Window.ID_ANDROID_CONTENT);
contentView.getChildAt(0).setFitsSystemWindows(false);
}
效果如下:
图中顶部的灰色透明带即为StatusBar状态栏。
需求三、全屏,仅仅隐藏TitleBar标题栏,该需求通常有两种方案来实现:
1、在Activity的OnCreate()方法setContentView(R.layout.activity_status_bar)代码之后添加以下代码:
this.getSupportActionBar().hide();
2、用以下代码替换1中的代码:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
效果图如下:
需求四、标题栏与状态栏颜色一致,这个需要以下几个步骤来完成:
1、在stylexml文件中配置主题:
<style name="status_toolbar_same_color" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/light_red</item>
</style>
2、在Manifest.xml文件中该Activity处添加主题:
<activity
android:theme="@style/status_toolbar_same_color"
android:name=".statusbar.StatusBarActivity" />
3、在Java代码中做下一步处理,在setContentView(R.layout.activity_status_bar)之后调用下面的方法:
int statusBarHeight = -1;
//获取status_bar_height资源的ID
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
//根据资源ID获取响应的尺寸值
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
statusBarHeight = statusBarHeight > 0 ? statusBarHeight : 50;
或者:
int statusBarHeight = -1;
Rect rectangle= new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
statusBarHeight = rectangle.top;
注意:
这里的50单位应该是dp才对,然后转化成对应的px值,这里为了举例,就没追求详尽和完美了。另外这个50的由来:大部分手机和的状态栏高度50。
Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(getResources().getColor(R.color.light_red));//这里的color值必须和1中的color值一致,否则会是两种颜色。
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup systemContent = (ViewGroup) findViewById(android.R.id.content);
View statusBarView = new View(this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
statusBarView.setBackgroundColor(getResources().getColor(R.color.light_red));//这里的color值必须和1中的color值一致,否则会是两种颜色。
systemContent.getChildAt(0).setFitsSystemWindows(true);
systemContent.addView(statusBarView, 0, lp);
}
注意:
上面代码中,有注释的两处要引起重视和注意。
然后运行,效果如下:
状态栏和标题栏很完美了。
顺便提一句:
在AndroidStudio上面新创建的Activity没有TitleBar的情况,有人提议让新建的Activity继承ActionBarActivity来解决这个问题,我是很明确反对的,原因如下:
1、ActionBarActivity虽然也是继承AppCompatActivity的,但是一个已经过时的类,google并不推荐我们继续使用。
2、我也曾经试过让新创建的Activity继承ActionBarActivity,但是运行之下,创建的Activity并没有出现TitleBar,很明显,问题并没有得到解决。
这里提供一个幼小的解决方案:就是在AndroidManifest.xml文件中对应的Activity设置主题:
<activity
android:theme="@style/AppTheme"
android:name=".statusbar.TitleBarActivity"/>
如此即可轻松解决问题,并不复杂。
还有一些其他的变态需求,这里先不说了,下次继续总结。