Android学习历程22-Android修改状态栏颜色和标题栏颜色一致

这个特性是andorid4.4支持的,最少要api19才可以使用。下面介绍一下使用的方法,非常得简单

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        // 透明状态栏
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        // 透明导航栏
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }

状态栏是指手机屏幕上面显示电量、信号的那一栏,
导航栏是指有些手机没有物理按键,程序运行是会在最下方的那些返回键、Home键那一栏


但是在我们实际开发过程中,如果仅仅只是调用这个方法会遇到一系列的问题:

1、设置状态栏透明之后,布局页面会被顶上去,导致界面内部的部分布局和状态栏发生覆盖,网上会有很多资料让在布局的最上面那个空间里面加入两行代码(比如你最上面的是TextView,那则在TextView的布局里面加入这两行代码):

android:fitsSystemWindows=true
android:clipToPadding=true

解释一下上面两个布局属性的意思:

android:clipToPadding 定义布局间是否有间距

android:fitsSystemWindows=”true” 意思就是设置应用布局时是否考虑系统窗口布局;如果为true,将调整系统窗口布局以适应你自定义的布局。比如系统有状态栏,应用也有状态栏时。看你这个布局代码,恰恰是在定义标题栏样式,所以用到这行代码了。

2、对于上面这种处理方式,在Activity里面是可以实现的,但是对于目前市面上绝大部分的应用程序而言,都是采用的Activity里面嵌套使用Frangment的模式,如果是这种结构,使用上面那种处理方式,则不会达到想要的效果,这时候我们就可以考虑另外一种实现方式:

在我们Fragment的布局的最上面加上一个填充快(TextView),来顶替目前的状态栏,因为我们在设置了状态栏同名之后,状态栏就会悬浮在我们当前的布局上方,那么我们设置一个与当前手机同高宽的TextView,则状态栏显示的东西会显示在这个TextView上面,这样就可以达到我们使得状态栏颜色和标题栏颜色一致的问题了。


这个问题还有一个关键,就是去获取当前手机的状态栏高度,代码如下:

public static int getStatusHeight(Context context) {

    int statusHeight = -1;
    try {
        Class clazz = Class.forName("com.android.internal.R$dimen");
        Object object = clazz.newInstance();
        int height = Integer.parseInt(clazz.getField("status_bar_height").get(object)
                .toString());
        statusHeight = context.getResources().getDimensionPixelSize(height);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return statusHeight;
}

取到手机状态栏的高度我们就可以通过代码去控制替代块TextView的高度了,代码如下:

tv_status.getLayoutParams().height = BaseFragment.tv_status_h;

注意:在手动控制TextView的高度的时候,不要使用tv_status.setHeight这个方法,这个方法在此时会失效,原因没有去细查,我猜测的原因可能是setHeight这个方法本来就是TextView的一个附加方法,在使用的时候会有一些场景的设置。

若知道上述原因的,求指导!

以上就是Android修改状态栏颜色和标题栏颜色一致的所有代码和思路了,望采纳。

你可能感兴趣的:(安卓开发)