如何在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_FULLSCREEN
和 SYSTEM_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中隐藏状态栏的主要内容,如果未能解决你的问题,请参考以下文章