如何在Android中隐藏状态栏

Posted

技术标签:

【中文标题】如何在Android中隐藏状态栏【英文标题】:How to hide status bar in 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 文件吗? 【参考方案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的链接:

*** : 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

【讨论】:

以上是关于如何在Android中隐藏状态栏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 4 中隐藏状态栏

android为啥透明不能全屏?如何将状态栏给隐藏起来。

如何在android中永久隐藏状态栏? [关闭]

如何在Android中隐藏状态栏

Android 显示、隐藏状态栏和导航栏

Android 如何在状态栏上隐藏 NotificationCompat.Builder 通知的图标?