Android隐藏标题栏、状态栏、导航栏及全屏方法总结
Android开发中,有时候根据需求要隐藏标题栏、状态栏、导航栏或者全屏显示。看似很简单的功能,但是不注意使用环境,就会出现错误。
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
在AndroidManifest.xml
中使用 android:theme="@android:style/Theme.Light.NoTitleBar"
或android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
来隐藏标题栏和状态栏的错误。
下面我们就来详细的分析下不同情景下,隐藏标题栏、状态栏、导航栏及全屏实现方法:
1. 隐藏标题栏
隐藏标题栏图① 在代码里实现
- Activity继承 Activity:
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
注意:一定要写在
setContentView()
方法之前
- Activity继承 AppCompatActivity:
getSupportActionBar().hide();// 隐藏ActionBar
② 在清单文件(AndroidManifest.xml中的application
或者activity
)里面实现
- Activity继承 Activity:
...
或
- Activity继承 AppCompatActivity:
...
或
③ 在style.xml文件里定义,在AndroidManifest.xml中的application
或者activity
上引用
- Activity继承 Activity/AppCompatActivity:
style.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
AndroidManifest.xml文件:
...
或
注意:
1)android:theme="@android:style/Theme.Light.NoTitleBar"
代码如果在application
中配置的话,整个APP的 Activity都只能是继承自Activity
,不能是AppCompatActivity
,因为AppCompatActivity
下的 Theme只能是ActionBar
样式的;如果只在某一个 Activity下配置,那么只要确保当前 Activity是继承Activity
,而不是继承AppCompatActivity
即可;
2)android:theme="@style/Theme.AppCompat.Light.NoActionBar"
代码如果在application
中配置的话,整个APP的Activity可以继承Activity
或者AppCompatActivity
;如果只在某一个 Activity下配置,当前 Activity可以继承Activity
或者AppCompatActivity
。
2. 隐藏状态栏
隐藏状态栏图① 在代码里实现
- Activity继承 Activity/AppCompatActivity:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
② 在清单文件(AndroidManifest.xml中的application
或者activity
)里面实现
- Activity继承 Activity:
...
或
③ 在style.xml文件里定义,在AndroidManifest.xml中的application
或者activity
上引用
- Activity继承 Activity/AppCompatActivity:
style.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
AndroidManifest.xml文件:
...
或
注意:
1)android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
代码如果在application
中配置的话,整个APP的Activity都只能是继承自Activity
,不能是AppCompatActivity
,因为AppCompatActivity
下的 Theme只能是ActionBar
样式的;
2)代码如果只在某一个 Activity下配置,那么只要确保当前Activity是继承Activity
,而不是继承AppCompatActivity
即可。
3. 隐藏导航栏
隐藏导航栏图public static void hideNavigationBar(Activity activity) { View decorView = activity.getWindow().getDecorView(); int option = SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_IMMERSIVE; decorView.setSystemUiVisibility(option);}
4. 显示全屏
- 非沉浸式
(1)有虚拟按键,隐藏标题栏、状态栏和导航栏;
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏,继承 Activityactivity.getSupportActionBar().hide();// 隐藏ActionBar,继承 AppCompatActivity
public static void setFullScreen(Activity activity) { int flags = 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; activity.getWindow().getDecorView().setSystemUiVisibility(flags);}
(2)无虚拟按键,隐藏标题栏和状态栏,若有虚拟按键,无法隐藏导航栏;
① 在代码里实现
Activity继承 Activity/AppCompatActivity:
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 activity.getSupportActionBar().hide();// 隐藏ActionBar
public static void setFullScreen(Activity activity) { activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);}
② 在清单文件(AndroidManifest.xml中的application
或者activity
)里面实现
Activity继承 Activity:
...
或
③ 在style.xml文件里定义,在AndroidManifest.xml中的application
或者activity
上引用
- Activity继承 Activity/AppCompatActivity:
style.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
AndroidManifest.xml文件:
...
或
- 沉浸式
(1)全沉浸
全沉浸式全屏显示图
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 activity.getSupportActionBar().hide();// 隐藏ActionBar
public static void setFullScreen(Activity activity) { Window window = activity.getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); }}
(2)半沉浸
① 在代码里实现
Activity继承 Activity/AppCompatActivity:
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 activity.getSupportActionBar().hide();// 隐藏ActionBar
public static void setFullScreen(Activity activity) { Window window = activity.getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); }}
② 在style.xml文件里定义,在AndroidManifest.xml中的application
或者activity
上引用
- Activity继承 Activity/AppCompatActivity:
style.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
注意:requires API level 19 (minSdkVersion 19),minSdkVersion 低于19会报错无法编译使用
AndroidManifest.xml文件:
...
或
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- widget开发实例代码
- Android下得到APK包含信息
- android 开发edittext获取焦点时hint消失
- Android设备不root,从App目录下拷贝文件