在android kitkat中使用新的沉浸式模式

在android kitkat中使用新的沉浸式模式,android,android-view,android-4.4-kitkat,Android,Android View,Android 4.4 Kitkat,我想做一个活动,进入沉浸式模式,并在开始时隐藏顶部和按钮系统栏 在android的开发者网站上,他们说我应该使用setSystemMiviability(),并提供SYSTEM\uUI\uFlag\uImmersive和SYSTEM\uUI\uFlag\uHide\uNavigation 如何在活动的OnCreate()方法中执行此操作?我认为Activity类中没有提供setSystemMiviability,它应该在视图中发生。有解决办法吗 更新 好的,根据DoorStick,我添加了以下行

我想做一个活动,进入沉浸式模式,并在开始时隐藏顶部和按钮系统栏

在android的开发者网站上,他们说我应该使用
setSystemMiviability()
,并提供
SYSTEM\uUI\uFlag\uImmersive
SYSTEM\uUI\uFlag\uHide\uNavigation

如何在活动的
OnCreate()
方法中执行此操作?我认为Activity类中没有提供
setSystemMiviability
,它应该在视图中发生。有解决办法吗

更新

好的,根据DoorStick,我添加了以下行,但我没有看到任何更改,导航栏和按钮仍然可见:

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
获取装饰视图:

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

Chris Banes gist展示了一个很好的助手类,我们可以使用它为从蜂巢到棒棒糖的所有版本设置沉浸式模式

更新: 我试着从他的github repo中获取它以包含在我的项目中,但我必须将gist文件克隆到我的项目中并调整packagename。如果有人知道如何正确地将其作为依赖项,欢迎帮助我

我在我的FullScreenActivity中添加了它。我想使用浸入式粘滞模式,如下所示:

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



}

答案已经给出,但这里是如何利用沉浸式模式。

在您的活动中:

就在setContentview()之前

调用方法:toggleHideyBar()

遵循开发者android的文档,并在您的活动中复制此方法。

更好,归功于:


您可以创建全局函数以进入沉浸式模式,如:

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


谢谢,但您能举个例子说明如何实现这一点吗?请看我对这个问题的更新。是否可以从Android风格设置所有这些标志,这样我就不必从我的活动中调用它?因此,我可以为不同版本的Android设置不同的样式?我的应用程序使用webview,因此我必须使用.getRootView()而不是.getDecorView(),才能使其正常工作。对于某些Android版本(6.0.1,甚至安卓P),这似乎不适用于来电情况:。怎么会?有没有办法克服这个问题?你能添加一些关于如何使用这个helper类的详细信息吗?@swiscoder我已经创建了一个github项目,它允许你使用它作为Gradle依赖项:似乎它不适用于一些安卓版本(6.0.1,甚至安卓P),以防来电:。怎么会?有没有办法克服这个问题?似乎这种方法不适用于某些Android版本(6.0.1甚至Android P),如果有来电:。怎么会?有没有办法克服这个问题?
<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>