界面图

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文件:

    ...  

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. widget开发实例代码
  7. Android下得到APK包含信息
  8. android 开发edittext获取焦点时hint消失
  9. Android设备不root,从App目录下拷贝文件

随机推荐

  1. Android(安卓)编译 ijkplayer
  2. Android中给Button加上selector——点击
  3. 【android】Eclipse ADT配置
  4. Android(安卓)Studio 混淆打包及常见第三
  5. 【Android】MapView和其它控件一起显示
  6. Android解压及打包system.img
  7. Android(安卓)贝塞尔曲线 折线图
  8. Android安卓知识点
  9. Android 根文件系统启动过程
  10. Android视频开发浅析