效果图
最近因为项目 需要做一些沉浸效果. 就在网上看了不少相关的资料;
文章结尾有demo地址
1.设置状态栏颜色
public static void setStatusBarColor(Activity activity, int color) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {View decorView = activity.getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; if (option != decorView.getSystemUiVisibility()) {decorView.setSystemUiVisibility(option); }if (color != activity.getWindow().getStatusBarColor()) {activity.getWindow().setStatusBarColor(color); }}}
2.设置状态栏 文字图标颜色 (深色或浅色) ; 当背景为浅色的时候 就需要改变状态栏 颜色为深色.
public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { View decor = activity.getWindow().getDecorView(); if (dark) { decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } }}
3.内容根布局设置为 true 让内容不被状态栏遮挡
setFitsSystemWindows(true);
如果根布局不设置 setFitsSystemWindows(true); 就是下图这种效果
设置之后
Activity 沉浸代码片段
@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置状态栏颜色为透明 setStatusBarColor(this, 0x00000000); setContentView(R.layout.activity_immerse); rootLayout = findViewById(R.id.rootLayout); //内容根布局设置为true 让内容不被状态栏遮挡 rootLayout.setFitsSystemWindows(true); findViewById(R.id.backButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } });}
Activity +多个Fragment 沉浸
在每个Fragment 里面的根布局 加上setFitsSystemWindows(true); 你会发现只有第一个显示出来的Fragment是正常的 后面显示的内容 依旧被状态栏挡住了; 这里是因为 setFitsSystemWindows(true);内部已经被消费一次了, 后面都不会执行了; 这个时候需要通过重写 FrameLayout 让它再次执行:
网友评论