在android kitkat中使用新的IMMERSIVE模式

时间:2014-01-15 10:53:00

标签: android android-view android-4.4-kitkat

我想让活动进入IMMERSIVE模式,并在它开始时立即隐藏top和buttom系统栏。

在Android的开发者网站中,他们说我应该使用setSystemUiVisibility()并提供SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_HIDE_NAVIGATION

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

更新

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

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 个答案:

答案 0 :(得分:44)

获取装饰视图:

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

答案 1 :(得分:5)

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

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

我在我的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();



}

答案 2 :(得分: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(){
...
}



}

答案 3 :(得分:2)

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

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可见性的变化。希望这会对你有所帮助。

答案 4 :(得分:0)

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

在您的活动中:

就在setContentview().......

之前

调用方法:toggleHideyBar();

关注Developer android中的文档documentation ,并在Activity中复制此方法。

答案 5 :(得分: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>