更好看的标题栏(1)

有时为了给用户更好的体验,我们需要更改标题栏的颜色和图标颜色,比如改为白底黑字,或者沉浸式状态栏等。

需求1:更改标题栏的颜色和图标颜色:

效果如下:

        

1. 在themes中统一设置

在style中添加

<!-- 修改标题栏为白色 ,注意后面版本号设置-->
<item name="android:statusBarColor" tools:targetApi="l">@color/white</item>
<!-- 修改标题栏字体为黑色 -->
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
2. 在代码中动态设置

直接调用这两个方法即可

//传入Activity,和修改后的颜色
public static void setWindowStatusBarColor(Activity activity, int colorResId) {
    
    
        try {
    
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    
    
                Window window = activity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                //顶部状态栏
                window.setStatusBarColor(activity.getResources().getColor(colorResId));
                //底部导航栏
                //window.setNavigationBarColor(activity.getResources().getColor(colorResId));
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
   //设置字体颜色,true表示黑色
 public static void setWindowLightStatusBar(Activity activity,boolean shouldChangeStatusBarTintToDark){
    
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
    
            View decor = activity.getWindow().getDecorView();
            if (shouldChangeStatusBarTintToDark) {
    
    
                decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            } else {
    
    
                decor.setSystemUiVisibility(0);
            }
        }
    }

需求2:全屏模式不隐藏状态栏:

在这里插入图片描述

注意此时整体的布局会上移动到标题栏要使用FitsSystemWindows
Android 状态栏适配 以及 windowInsets探究

public static void transparencyBar(Activity activity) {
    
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    
    
            Window window = activity.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

            window.setStatusBarColor(Color.TRANSPARENT);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    
    
            Window window = activity.getWindow();
            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

需求3:全屏模式隐藏状态栏:

在这里插入图片描述

 public void hideBar(Activity activity) {
    
    
        //在api大于等于30的谷歌推荐用这种方式

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    
    
            WindowInsetsController ic = activity.getWindow().getInsetsController();
            if (ic != null) {
    
    
                ic.hide(WindowInsets.Type.statusBars());
                ic.hide(WindowInsets.Type.navigationBars());
            }
        }
         else if (Build.VERSION.SDK_INT < 16) {
    
    

            activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        else{
    
    
            View decorView = activity.getWindow().getDecorView();
            // Hide the status bar.
            int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
            // Remember that you should never show the action bar if the
            // status bar is hidden, so hide that too if necessary.

            //设置action bar隐藏
            ActionBar actionBar = getSupportActionBar();
            actionBar.hide();
        }
        
    }
当然这些有的可能出现不适配版本和不同类型手机的问题,网上实现的方法也有很多,更多的参考下面的文章:

developers-隐藏状态栏
developers-WindowInsetsController
developers-setSystemUiVisibility
Android setSystemUiVisibility详解
developers-启用全屏模式
Android透明状态栏与状态栏文字颜色更改
android沉浸式状态栏、fitsSystemWindows、标题栏折叠
Android沉浸式状态栏最简单的实现

猜你喜欢

转载自blog.csdn.net/haazzz/article/details/110948731