【问题标题】:How to hide status bar in Android如何在Android中隐藏状态栏
【发布时间】:2011-07-22 19:52:49
【问题描述】:

我提到了这个link。如果用户点击 EditText(例如 To: ),此时键盘将弹出,同时用户可以滚动查看所有剩余的视图(例如:撰写、主题、发送按钮)那个屏幕。同样,在我的应用程序中,我有一项活动,即我有一些小部件或视图。 假设如果用户点击我的 Activity 中的 Edittext,那么键盘会弹出,我可以滚动查看剩余的视图。但是,如果我在清单中提供此属性android:theme="@android:style/Theme.NoTitleBar.Fullscreen",我将无法滚动查看剩余视图,但如果在清单中提供这样的属性android:theme="@android:style/Theme.NoTitleBar",我可以滚动查看剩余视图,但该屏幕中有状态栏,在这里我想要全屏,即使弹出键盘我也可以滚动查看剩余的视图..?我必须为此做出哪些改变..?

【问题讨论】:

  • @user448250:请注意,您无法在 Android 3.0 中隐藏状态栏,并且您很有可能无法在以后隐藏状态栏。在 Android 3.0 中,状态栏包含 BACK 和 HOME 按钮,因此状态栏需要始终可用。
  • 我刚刚设法在 3.0 API 级别 11 的模拟器上隐藏了标题和状态栏。
  • 全屏应该还是允许的,用户在玩全屏游戏时通常不想看到状态栏。
  • @user448250 你发现了吗?
  • 什么是活动?它是您网站文件夹中的一些 xml 文件吗?

标签: android android-theme android-statusbar


【解决方案1】:

在你的活动中写下这个

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

在这里查看文档:https://developer.android.com/training/system-ui/status.html

您的应用将全屏显示。没有状态栏,没有标题栏。 :)

【讨论】:

  • 请注意,如果您的活动超类在 onCreate 方法中调用 setContentView,这将不起作用 - 应用程序将退出并出现异常。
  • @Ron 我在 API 级别 8 上进行测试。可能其他级别的行为不同?
  • 这对从 2.3.x 到 4.x 的所有版本都有效吗?
  • 这仍然会阻止屏幕在显示软键盘时滚动。
  • 如果崩溃,请在super.onCreate(savedInstanceState);之前使用它
【解决方案2】:

使用主题"Theme.NoTitleBar.Fullscreen"并尝试为AndroidManifest.xml.中的活动设置"android:windowSoftInputMode=adjustResize"您可以找到详细信息here

【讨论】:

  • 通过上述方法,当应用全屏运行时,我的状态栏可以隐藏,但是,当我向下滑动页面时,我仍然可以看到状态栏。如果我根本不想要状态栏,有什么办法吗?
【解决方案3】:

使用此代码在您的应用中隐藏状态栏并易于使用

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

【讨论】:

    【解决方案4】:
     if (Build.VERSION.SDK_INT < 16) {
       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     } else {
         View decorView = getWindow().getDecorView();
          int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
          decorView.setSystemUiVisibility(uiOptions);
          ActionBar actionBar = getActionBar();
          actionBar.hide();
     }
    

    【讨论】:

    • 我注意到,当我使用此方法时,显示软键盘会将视图移动到 editText 上方,而不是调整大小。我该如何解决这个问题?
    【解决方案5】:

    如果你在一个活动中需要这个,你必须在 setContentView 之前放入 onCreate:

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    setContentView(R.layout.your_screen);
    

    【讨论】:

    • 这种方式可以让键盘覆盖webview中的输入框。
    • @AllenVork 有什么解决办法吗?
    【解决方案6】:

    将此添加到您的活动类

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(
                            WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        // some your code
    }
    

    【讨论】:

      【解决方案7】:

      将此用于您的Activity

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
      }
      

      【讨论】:

        【解决方案8】:

        如果您要隐藏状态栏,请在 onCreate(for Activity) 和 onCreateView/onViewCreated(for Fragment) 中执行此操作

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        

        并且不要忘记在退出活动时清除标志,否则访问此活动后您的整个应用程序将全屏显示。 要清除在您的 onDestroy(for Activity) 或 onDestroyView(for Fragment) 中执行此操作

        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
        

        【讨论】:

          【解决方案9】:
          void hideStatusBar() {
                  if (Build.VERSION.SDK_INT < 16) {
                     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                              WindowManager.LayoutParams.FLAG_FULLSCREEN);
                  } else {
                      View decorView = getWindow().getDecorView();
                      int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
                      decorView.setSystemUiVisibility(uiOptions);
                  }
              }
          

          您可以使用此方法隐藏状态栏。这对于隐藏操作栏也很重要。在这种情况下,如果您从支持库(如 Appcompat)扩展了活动,则可以 getSupportActionBar().hide(),或者您可以简单地调用 getActionBar().hide()在上面提到的方法之后。谢谢

          【讨论】:

            【解决方案10】:

            manifest.xml文件中更改应用程序的主题。

            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            

            【讨论】:

            • 奇怪的是,这会在屏幕顶部显示一个橙色条。不过通知栏是隐藏的。
            【解决方案11】:

            使用此代码:

            requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.youractivityxmlname);
            

            【讨论】:

              【解决方案12】:

              在AndroidManifest.xml -> 在你想使用的activity里面,添加以下内容:

              android:theme="@style/Theme.AppCompat.Light.NoActionBar"
              //this is for hiding action bar
              

              在 MainActivity.java -> onCreate() 方法中,添加以下内容:

              this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
              //this is for hiding status bar
              

              【讨论】:

                【解决方案13】:

                此代码隐藏状态栏。

                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
                

                隐藏操作栏写下这一行:-

                requestWindowFeature(Window.FEATURE_NO_TITLE);
                

                这两行可以一起写来隐藏操作栏和状态栏。所有这些行都必须写在onCreate 方法中的setContentView 方法调用之前。

                【讨论】:

                • 效果很好。谢谢!
                【解决方案14】:

                你可以使用styles.xml来隐藏

                <resources>
                
                <!-- Base application theme. -->
                <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
                    <!-- Customize your theme here. -->
                    <item name="colorPrimary">@color/colorPrimary</item>
                    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
                    <item name="colorAccent">@color/colorAccent</item>
                </style>
                <style name="HiddenTitleTheme" parent="AppTheme">
                    <item name="windowNoTitle">true</item>
                    <item name="windowActionBar">false</item>
                </style>
                

                像这样在你的清单中调用它android:theme="@style/HiddenTitleTheme"

                【讨论】:

                  【解决方案15】:

                  由于 FLAG_FULLSCREEN 已从 android R 中弃用。您可以使用以下代码隐藏状态栏。

                   @Suppress("DEPRECATION")
                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                  
                             window.insetsController?.hide(WindowInsets.Type.statusBars())
                      } else {
                  
                             window.setFlags(
                                      WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                      WindowManager.LayoutParams.FLAG_FULLSCREEN
                              )
                          }
                  

                  【讨论】:

                  • 这是不正确的,它们的行为与 inset 的行为不同 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
                  【解决方案16】:

                  您可以通过使用 xml 将其颜色设置为透明来隐藏状态栏。将 statusBarColor 项添加到您的活动主题中:

                  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
                      <item name="android:statusBarColor">@android:color/transparent</item>
                  </style>
                  

                  【讨论】:

                  • 请添加一些解释代码,只有答案对其他人来说有点混乱
                  【解决方案17】:

                  这对我来说是最好的解决方案,只需在你的 theme.xml 中写下这一行

                  <style name="MyApp" parent="Theme.AppCompat.Light.NoActionBar">
                  ...
                  <item name="windowNoTitle">true</item>
                  <item name="windowActionBar">false</item>
                  <item name="android:windowFullscreen">true</item>
                  ...
                  </style>
                  

                  【讨论】:

                    【解决方案18】:
                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                    
                        setTheme(R.style.Theme_AppCompat_Light_NoActionBar);
                        requestWindowFeature(Window.FEATURE_NO_TITLE);
                    
                        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
                        , WindowManager.LayoutParams.FLAG_FULLSCREEN);
                    
                        setContentView(R.layout.activity__splash_screen);
                    }
                    

                    【讨论】:

                    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
                    • 我不太了解 AppCompat 到底是什么,只是在使用它。而这三行就完成了这项工作。
                    • 遗憾的是,谷歌自己的文档一如既往地不正确如何实现这一点。也许他们应该复制粘贴这段代码。
                    【解决方案19】:

                    这是关于在 Android 4.0 及更低版本和 Android 4.1 及更高版本上隐藏状态栏的官方文档

                    请看一下:

                    https://developer.android.com/training/system-ui/status.html

                    【讨论】:

                      【解决方案20】:

                      包括 android api 30,这对我有用

                      if (Build.VERSION.SDK_INT < 16) {
                              window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
                          } else if (Build.VERSION.SDK_INT < 30) {
                              window.decorView?.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
                              actionBar?.hide()
                          } else {
                              window.decorView.windowInsetsController?.hide(WindowInsets.Type.statusBars())
                          }
                      

                      【讨论】:

                        【解决方案21】:

                        如果您正在使用更高级别的 API,那么您可能已经注意到上述答案中提到的标志,即 FLAG_FULLSCREENSYSTEM_UI_FLAG_FULLSCREEN 已弃用。

                        要覆盖整个屏幕,您可以定义自定义主题:

                        <resources xmlns:android="http://schemas.android.com/apk/res/android">
                            <style name="ActivityTheme" parent="Theme.AppCompat.NoActionBar">
                                <item name="android:windowFullscreen">true</item>
                            </style>
                        </resources>
                        

                        manifest 中的activity 中添加主题,例如android:theme="@style/ActivityTheme",就完成了。

                        注意:您还可以直接在清单中添加预定义的 @android 主题:android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"。在这种情况下,请确保您的活动扩展 Activity() 而不是 AppCompatActivity()

                        【讨论】:

                          【解决方案22】:

                          我们无法阻止在 (4.4+) kitkat 或更高版本的设备中以全屏模式显示状态,因此请尝试破解以阻止状态栏扩展。

                          解决方案很大,所以这里是SO的链接:

                          StackOverflow : Hide status bar in android 4.4+ or kitkat with Fullscreen

                          【讨论】:

                          • 我觉得你错了,请看官方关于隐藏状态栏的信息developer.android.com/training/system-ui/status.html
                          • 何塞,我将检查给定链接上的信息,并在需要时更新答案。这个问题/答案是在一年前添加的,当时还没有针对这种情况的官方解决方案。可能在下一个版本或版本 google/android 中添加了相同的 API/方法。如果他们提供了解决方案,那真是令人高兴。谢谢!
                          【解决方案23】:

                          这个解决方案对我有用:)

                          @Override
                          protected void onCreate(@Nullable Bundle savedInstanceState) {
                              super.onCreate(savedInstanceState);
                              if (Build.VERSION.SDK_INT >= 19) {
                                     getWindow().setFlags(AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT, AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT);
                                     getWindow().getDecorView().setSystemUiVisibility(3328);
                              }else{
                                     requestWindowFeature(Window.FEATURE_NO_TITLE);
                                     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
                              }
                          
                              DataBindingUtil.setContentView(this, R.layout.activity_hse_video_details);
                          

                          【讨论】:

                            【解决方案24】:
                            public class MainActivity extends Activity {
                            
                            @Override
                            protected void onCreate(Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                // If the Android version is lower than Jellybean, use this call to hide
                                // the status bar.
                                if (Build.VERSION.SDK_INT < 16) {
                                    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
                                } else {
                                   View decorView = 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.
                                   ActionBar actionBar = getActionBar();
                                   actionBar.hide();
                                }
                            
                                setContentView(R.layout.activity_main);
                            
                            }
                            ...
                            }
                            

                            【讨论】:

                              【解决方案25】:

                              用于Manifest

                              android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
                              

                              【讨论】:

                              • 可能取决于主题。就我而言,发生了异常:“java.lang.IllegalStateException:您需要在此活动中使用 Theme.AppCompat 主题(或后代)。”
                              【解决方案26】:

                              如果你参考Google Documents你可以在android 4.1及以上使用这个方法,在setContentView()之前调用这个方法

                              public void hideStatusBar() {
                                  View view = getWindow().getDecorView();
                                  int uiOption = View.SYSTEM_UI_FLAG_FULLSCREEN;
                                  view.setSystemUiVisibility(uiOption);
                                  ActionBar actionBar = getActionBar();
                                  if (actionBar != null) {
                                      actionBar.hide();
                                  }
                              }
                              

                              【讨论】:

                                【解决方案27】:

                                在 Style.xml 文件中添加或替换

                                <item name="android:statusBarColor">@android:color/transparent</item>
                                

                                【讨论】:

                                  【解决方案28】:

                                  我们可以在 Android 4.1(API 级别 16)及更高版本中使用 setSystemUiVisibility() 隐藏状态栏

                                  window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
                                  

                                  根据谷歌文档,如果 状态栏已隐藏,因此如有必要也将其隐藏。

                                  actionBar?.hide()
                                  

                                  【讨论】:

                                    【解决方案29】:

                                    我知道我回答得太晚了。 为此,我在相关的 java 文件中使用了以下代码

                                    Objects.requireNonNull(getSupportActionBar()).hide();
                                    

                                    【讨论】:

                                      【解决方案30】:

                                      如果您使用的是 Compose,那么您可以导入

                                      implementation "com.google.accompanist:accompanist-systemuicontroller:0.17.0"
                                      

                                      然后在你的屏幕上写

                                      val systemUiController = rememberSystemUiController()
                                      systemUiController.isStatusBarVisible = false
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2012-02-28
                                        • 2017-10-08
                                        • 1970-01-01
                                        • 2021-02-20
                                        • 2016-05-10
                                        • 2021-10-11
                                        相关资源
                                        最近更新 更多