Android开发中对于状态栏你会怎么处理?

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

  1. 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三方不同厂商的定制,适配也不一样,这是令人头疼的一个问题,对于小米和魅族这两种特别机型的适配,给出了如下方案。点击进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值