【问题标题】:Display only status bar in android?在android中只显示状态栏?
【发布时间】:2019-10-29 00:20:35
【问题描述】:

我希望应用只显示状态栏,并让导航栏处于IMMERSIVE_STICKY 模式。尝试了很多东西,但不知何故,导航栏保持不变,状态栏被隐藏了。材料主题会与全屏功能混淆吗?

尝试了针对同一问题的其他相关问题,但他们以黑客的形式解决了问题,而且解决方案的 API 版本较旧。这是我的主题属性和相关设置代码:

<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">

        <item name="windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>```

【问题讨论】:

  • windowFullscreen 隐藏状态栏,而 NoActionBar 主题应该隐藏系统 ActionBar,即使没有明确的 windowActionBar = false。您能否检查一下布局是否添加了自定义工具栏作为 ActionBar?
  • 尝试获取supportActionBar,结果为null。
  • 当您说“导航栏”时,您是指生成的系统显示在底部,并带有“返回”、“主页”和“最近”等操作?我把它误读为导航抽屉,所以我专注于 ActionBar(顶部的那个,就在状态栏下面)。
  • 是的。最底层的

标签: android android-statusbar


【解决方案1】:

根据此处的docs,您需要使用SYSTEM_UI_FLAG_HIDE_NAVIGATION 才能隐藏底部导航栏。他们还传递了SYSTEM_UI_FLAG_FULLSCREEN 标志,因为在隐藏导航栏时也隐藏状态栏是一种很好的做法。

View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

如果我正确解释了这个问题,您的要求不是隐藏状态栏,也不是隐藏导航栏。因此,您不应该在任何地方传递全屏标志。从上面的 sn-p 中删除它,并从您的主题中删除 android:windowFullscreen。这应该使状态栏像往常一样显示。

所以你的实际uiOptions 将是

int uiOptions = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;

注意:如文档中所述,IMMERSIVE_STICKY 仅确保导航栏区域中的任何触摸事件/手势也传输到应用程序。如果用户在那里滑动,它仍然会显示一个半透明的导航栏。正如other answers 中提到的,如果没有某种形式的 root 访问权限,应该不可能完全删除它。


编辑:我最初使用AppCompatActivity 和默认的Theme.AppCompat.Light.NoActionBar 主题对此进行了测试。还使用 OP 的android:Theme.Material.Light.NoActionBar 进行了测试(需要使用Activity 而不是AppCompatActivity)。他们都工作了。

【讨论】:

  • 我假设您的 API 级别肯定高于 Android 4.1,因为那是很久以前的事了。
  • 试过了。但它不起作用。我的意思是如果我使用 FULLSCREEN 标志,那么它会进入 IMMERSIVE 模式,但没有它,导航栏是可见的。
  • 是的,我不想永久隐藏它。基本上,我想要 IMMERSIVE 行为,但显示状态栏。
  • 您能说说您的最低 API 级别吗?因为我用它制作了一个演示应用程序,它可以按照你的意愿工作。像导航栏一样身临其境,状态栏始终可见。尝试自己制作一个新应用程序,看看它是否有效?这意味着您当前应用程序中的其他东西正在搞乱它。
  • 适用于 Material 主题并在新应用中扩展 FragmentActivity。我猜我搞砸了。
【解决方案2】:

1)通过代码,您可以使用以下方式隐藏操作栏。

class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    supportActionBar?.hide()
  }
}

这一行supportActionBar?.hide() 仅隐藏操作栏。见附图。

2)通过带有主题的XML

首先,在styles.xml中添加一个样式:

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

AndroidManifest.xml 并将其应用于要隐藏操作栏的活动。

<activity
android:name=".MyActivity"
android:theme="@style/AppTheme.NoActionBar"/>

【讨论】:

  • 我想显示状态栏并隐藏导航栏。您的代码隐藏了操作栏。与问题无关。
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多