项目开发中,关于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的目的。效果如下:

Android 状态栏与toobar融合 android显示状态栏_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);
    }

效果如下:

Android 状态栏与toobar融合 android显示状态栏_StatusBar_02


图中顶部的灰色透明带即为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);

效果图如下:

Android 状态栏与toobar融合 android显示状态栏_TitleBar_03

需求四、标题栏与状态栏颜色一致,这个需要以下几个步骤来完成:
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);
}

注意:

上面代码中,有注释的两处要引起重视和注意。

然后运行,效果如下:

Android 状态栏与toobar融合 android显示状态栏_TitleBar_04

状态栏和标题栏很完美了。

顺便提一句:

在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"/>

如此即可轻松解决问题,并不复杂。

还有一些其他的变态需求,这里先不说了,下次继续总结。