在安卓4.4中使用新的沉浸式模式

22

我想制作一个能够进入沉浸式模式并在启动时隐藏顶部和底部系统栏的活动。

在安卓开发者网站上,他们说我应该使用setSystemUiVisibility()方法,并提供SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_HIDE_NAVIGATION参数。

我应该如何在活动的OnCreate()方法中实现这个功能呢?我认为setSystemUiVisibility()方法不是Activity类中提供的,而是需要在View中进行。是否有解决方法?

更新

好的,根据doorstuck的建议,我添加了以下几行代码,但我没有看到任何改变,导航栏和底部按钮仍然可见:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
        }
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE);
    }

    //Rest of activity code
6个回答

47

获取装饰视图:

getWindow().getDecorView().setSystemUiVisibility(...)

请记住这些参数是二进制标志。只调用上述方法一次:

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);

谢谢,但你能给个实现的例子吗?请看我对问题的更新。 - Dumbo
3
是否可以从 Android 样式中设置所有这些标志,以便我不必从我的 Activity 中调用它?这样我就可以为不同版本的 Android 设置不同的样式了吗? - Cilenco
3
我的应用程序使用了Webview,因此为了使其正常工作,我必须使用.getRootView()而不是.getDecorView()。 - Heitor
似乎在某些 Android 版本(6.0.1 甚至 Android P)中,在来电时此方法无法正常工作:https://issuetracker.google.com/issues/111315651。为什么会这样?有没有办法克服这个问题? - android developer

6

Chris Banes的 gist 展示了一个好用的帮助类,我们可以使用它来设置从HoneyComb到Lollipop所有版本的沉浸模式https://gist.github.com/chrisbanes/73de18faffca571f7292

更新: 我尝试从他的 github 仓库获取并将其包含在我的项目中,但我必须将 gist 文件克隆到我的项目中并调整软件包名称。如果有人知道如何将其正确地包含为依赖项,则欢迎帮助我。

我将它添加在我的FullScreenActivity中,我想这样使用 ImmersiveStickyMode:

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

        final int flags = 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;

        SystemUiHelper uiHelper =  new SystemUiHelper(this, SystemUiHelper.LEVEL_IMMERSIVE ,flags);
        uiHelper.hide();



}

你能否添加一些关于如何使用这个帮助类的细节? - abarisone
2
@swisscoder 我创建了一个 Github 项目,允许您将其用作 Gradle 依赖项:https://github.com/intrications/SystemUiHelper - Intrications
似乎在某些 Android 版本(6.0.1 甚至是 Android P)中,在来电时它无法正常工作:https://issuetracker.google.com/issues/111315651。为什么会这样?有没有办法克服这个问题? - android developer

3
您可以创建全局函数以进入沉浸模式,如下所示:
public static void enableImmersiveMode(final View decorView) {
        decorView.setSystemUiVisibility(setSystemUiVisibility());
        decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                    decorView.setSystemUiVisibility(setSystemUiVisibility());
                }
            }
        });
    }


public static int setSystemUiVisibility() {
        return 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;
 }

上述代码还将控制系统UI可见性的更改。希望这能帮到你。

似乎在某些 Android 版本(6.0.1 甚至 Android P)中,这种方法在来电时不起作用:https://issuetracker.google.com/issues/111315651。为什么会这样?有没有办法克服这个问题? - android developer

2

非常好的建议,感谢William J. Francis

   public class GameActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        /* my code you dont need this
        assets=getAssets();
        sGame= new GameView(this, GAME_WIDTH, GAME_HEIGHT);
        setContentView(sGame);  
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        */


        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 // hide nav bar
                | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }

@Override         
protected void onDoSomethingOtherImportantThing(){
...
}



}

0

android:immersive="true" 会隐藏底部系统栏

<application> 
 <activity
        android:name=".CarrierActivity"
        android:label="@string/app_name"
        android:excludeFromRecents="true"
        android:immersive="true"
        android:configChanges="orientation|keyboardHidden|screenSize">
        <intent-filter>
         <action android:name="com.example.SetupWiz.SUW_CARRIER"/>
         <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>
    </activity>
</application>  

0

已经有答案了,但是这里是如何利用沉浸式模式的方法。

在你的活动中:

在setContentview()之前......

调用方法:toggleHideyBar();

按照开发者Android的文档,将此方法复制到您的活动中。


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