隐藏状态栏和Toolbar+沉浸式状态栏

隐藏状态栏和Toolbar

默认效果:


screen.png

在res文件夹下的values文件夹里的styles.xml文件中


在AndroidManifest.xml,给需要的Activity应用上面的style即可


效果如下:


screen.png

状态栏和 ActionBar 都没了。

沉浸式状态栏

测试设备 Android 版本:11

创建一个全新的 Activity,并添加 theme,theme 为:


1.png

现在在顶部添加一张图片


2.png

想让图片延伸到状态栏的背后
给父布局添加 id,我这里父布局是 RelativeLayout,所以先定义 id 为 rl,然后在 Activity 中修改:

import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
import android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE

class ImmersiveActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_immersive)
        val rl = findViewById(R.id.rl)
        // 使其内容延伸到状态栏的背后(CoordinatorLayout 源码中是这样使用的)
        rl.systemUiVisibility = (SYSTEM_UI_FLAG_LAYOUT_STABLE or SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }
}
3.png

可以看到图片延伸到状态栏的背后了,但是由于状态栏的颜色是黑色,所以不是很美观,接下来修改状态栏的颜色:


4.png

沉浸式状态栏就实现了,具体的原理看最后面那篇郭神的文章。
如果想实现延伸到导航栏的背后也是可以的,不过不是给控件设置属性,而是给 DecorView 设置:

class ImmersiveActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_immersive)
        // val rl = findViewById(R.id.rl)
        // 使其内容延伸到状态栏的背后(CoordinatorLayout 源码中是这样使用的)
        // rl.systemUiVisibility = (SYSTEM_UI_FLAG_LAYOUT_STABLE or SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        // 这个和不设置没有任何区别(也就是没用)
        // rl.systemUiVisibility = (SYSTEM_UI_FLAG_LAYOUT_STABLE)
        // 使其内容延伸到状态栏的背后
        // rl.systemUiVisibility = (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)

        // 使整个 window 延伸到状态栏和导航栏的背后
        window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        // 使整个 window 延伸到状态栏的背后
        // window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        // 使整个 window 延伸到状态栏和导航栏的背后
        // window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    }
}

如果使用了修改 DecorView 的方式,就不用修改控件了。
在沉浸式状态栏下,有些控件不想延伸到状态栏背后,就可以在这些控件上加 android:fitsSystemWindows="true"

后面内容的可以选择性看

https://github.com/laobie/StatusBarUtil(效果能达到一部分要求,但还是有黑影,不是完全的透明)

半透明.jpg

下面是完全透明的效果
环境是 androidx
  • 1、添加依赖(Material Design的依赖)
    这一步自己按自己的实际应用来,我这里用到了 Material Design
implementation 'com.google.android.material:material:1.3.0-alpha01'
  • 2、在 res 文件下的 values 文件的 styles.xml 文件中


    
    
    

    


并且在 res 文件夹下创建文件夹名为 values-v19、values-v21 的两个文件夹


values.jpg

values-v19 文件夹下的 styles.xml 文件中



    
    

    

values-v21 文件夹下的 styles.xml 文件中



    
    

    

在 AndroidManifest.xml 文件中给需要的 Activity 添加 theme 引用上面的 TranslucentTheme 就行了

  • 3、最后在需要使状态栏透明的界面的xml文件中
    如果布局的内容会显示到状态栏,就在布局节点上加上以下一行代码
android:fitsSystemWindows="true"

例如下面的布局




    
    

        ......

    

    
    

        ......

    

    
    


完全透明.jpg

但是有问题,如果用户的手机用的是屏幕内导航,就会出现如下情况:


screen.png

下面那张图跑到了导航栏下面。
项目导入以下依赖:

implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
import androidx.appcompat.app.AppCompatActivity;

import com.gyf.immersionbar.ImmersionBar;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        // 原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,
        // 如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度
        ImmersionBar.with(this)
                // false 设置状态栏字体颜色为白色
                // true 设置状态栏字体颜色为黑色
                .statusBarDarkFont(false, 0.2f)
                .init();
    }
}

screen.png

再学一遍android:fitsSystemWindows属性
Android 状态栏(沉浸式状态栏,改变状态栏背景颜色)

你可能感兴趣的:(隐藏状态栏和Toolbar+沉浸式状态栏)