应用启动时立即隐藏状态栏和导航栏

5
我想知道是否有一种方法可以在应用启动时隐藏Android设备的软键(状态和导航栏)?例如,一个游戏最初显示黑屏,同时在运行时隐藏软键,直到品牌、标题和主菜单屏幕。
我在MainActivity中包含了以下代码片段,当应用程序启动时,我最初看到一个带有运行时软键的白色屏幕,大约持续一秒钟,然后在MainActivity线程完成运行时软键消失:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        getWindow().getDecorView().setSystemUiVisibility(
                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_STICKY);
    }
}

非常感谢。

* 2017年1月19日更新:* 在包含以下内容后:

<item name="android:windowFullscreen">true</item>

如果将某些东西整合到应用程序的主题中,只有状态栏在规定时间内隐藏,而导航栏不会。我第二篇文章 - 在应用程序启动时立即隐藏导航栏


也许在您的情况下可以利用这个解决方案... - Onik
3个回答

5
请查看您的styles.xml文件,并添加android:windowFullscreen项。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowFullscreen">true</item>
</style>

我希望能对您有所帮助。 Ben

奇怪,我在我的设备上尝试了一下,它立即就能工作。祝你调试好运。 - bedawi
3
您是指状态栏和导航栏都需要隐藏吗?您使用的设备是什么?因为我尝试了上面的代码在我的运行Android 6.0的设备上,只有状态栏能够正确隐藏。 - DaveNOTDavid
这是我的最新进展:https://dev59.com/d57ha4cB1Zd3GeqPiV0S - DaveNOTDavid

2
在所有全屏活动的onCreate()方法中,在super.onCreate(savedInstanceState)之前设置沉浸模式标志是关键。
@Override
 protected void onCreate(Bundle savedInstanceState) {
     hideSystemUI(getWindow());   //this hides NavigationBar before showing the activity

     super.onCreate(savedInstanceState);

     setContentView(R.layout.activity_main); 
     ...
}

同时不要忘记在所有全屏活动中添加以下代码

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    hideSystemUI(getWindow());
}

public static void hideSystemUI(Window window) {
    window.getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LOW_PROFILE
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    );
}

请在styles.xml的activity主题中添加以下行:
<style name="FullScreenAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     ...

     <item name="android:windowFullscreen">true</item>
     <item name="android:windowTranslucentNavigation">true</item>
</style>

这个功能应该适用于Android API 19及以上版本。在API 21及以上版本上进行了测试。启动器活动可能无法立即隐藏导航栏,但从启动器活动启动的所有其他全屏活动在打开时肯定不会显示导航栏。
希望能有所帮助!

0

有几种方法可以实现(在这里描述 - https://developer.android.com/training/system-ui/status.html):

1) 在活动的onCreate()方法中再次调用setSystemUiVisibility()。

2) 对于Android 4.0及更低版本。您可以在XML布局中更改主题,如下所示: ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ...

3) 对于Android 4.0及更低版本。在Activity的onCreate(Bundle savedInstanceState)方法中隐藏状态栏。以下是来自上述网站的示例:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    if (Build.VERSION.SDK_INT < 16) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

我目前正在使用沉浸式粘性模式来显示全屏应用,因此我将使用Android 4.4作为最低版本...但是,你是否曾经找到过如何在启动时像游戏或YouTube的全屏模式一样隐藏状态栏和导航栏的方法?这是我最近发布的一个相关问题:https://dev59.com/d57ha4cB1Zd3GeqPiV0S - DaveNOTDavid
尝试添加标志View.SYSTEM_UI_FLAG_HIDE_NAVIGATION到setSystemUiVisibility。但是,如果您触摸任何地方,导航栏将重新出现。 - Reaper
你可能想使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,以使你的应用内容出现在导航栏后面。 - Reaper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接