在按下音量或最小化还原后,沉浸模式导航变得粘滞

Yar*_*lyk 29 android android-fullscreen

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.getWindow().getDecorView().setSystemUiVisibility(getSystemUiFlags());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    private static int getSystemUiFlags() {
            return View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    }

}
Run Code Online (Sandbox Code Playgroud)

第一次开始后

第一次开始后

按下音量按钮后或按下最近的应用程序两次后

在此输入图像描述

我看到QuickPic应用程序没有这个bug.我想知道他们是如何省略它的.

小智 55

以下代码适用于我:

public void updateUI() {
    final View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                decorView.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);
                }
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

并调用了监听器onCreateonResume方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    updateUI();
}

@Override
public void onResume() {
    super.onResume();
    updateUI();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果出现键盘,它不适合我 (7认同)

小智 21

我的解决方案是在三个位置设置UI-Visibility标志:

  1. 在获得焦点时
  2. 在onResume
  3. 在OnSystemUiVisibilityChangeListener侦听器中

第三个解决了我的问题.可能不需要其他人,但我离开了他们.这是看起来像:

  private void setupMainWindowDisplayMode() {
    View decorView = setSystemUiVisilityMode();
    decorView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
      @Override
      public void onSystemUiVisibilityChange(int visibility) {
        setSystemUiVisilityMode(); // Needed to avoid exiting immersive_sticky when keyboard is displayed
      }
    });
  }

  private View setSystemUiVisilityMode() {
    View decorView = getWindow().getDecorView();
    int options;
    options =
        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;

    decorView.setSystemUiVisibility(options);
    return decorView;
  }
Run Code Online (Sandbox Code Playgroud)

setupMainWindowDisplayMode()在onCreate()中被调用.

  • 哎呀,Android开发有时真的很可怕. (13认同)

小智 18

我有同样的问题,我用一个简单的解决方法解决了它.即使我找不到这种解决方法的理论原因,但无论如何它对我有用.

看起来当按下音量按钮时,与"沉浸式模式"相关的"标志"被清除.我认为这就是为什么沉浸式模式被禁用并且沉浸式模式不会自动恢复的原因.

因此,在按下带有'runnable'对象的音量按钮后,我尝试设置'标志'.

所以,它的工作原理如下:

沉浸式模式 - >按下音量按钮(标志清除) - > 500ms后,可运行对象再次设置标志 - >沉浸式模式恢复

1.首先,定义runnable对象以设置标志

private Runnable decor_view_settings = new Runnable()
{
    public void run() 
    {
        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);
    }
};
Run Code Online (Sandbox Code Playgroud)

2.按下音量按钮时,将可运行对象稍稍延迟发布到处理程序

private Handler mHandler = new Handler();
Run Code Online (Sandbox Code Playgroud)

...

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        finish();
    }
    else if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)
    {
        mHandler.postDelayed(decor_view_settings, 500);
    }

    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

我只是毫无理由地推迟了500毫秒,这并不重要.

3.具有可运行对象的沉浸式模式的基本代码

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

    if(hasFocus) 
    {
        mHandler.post(decor_view_settings);
    }
}
Run Code Online (Sandbox Code Playgroud)

它完全适用于我的应用程序.

因此,当我按下音量按钮时,沉浸式模式被禁用并且音量摇杆弹出.

几秒钟后,音量摇杆消失,状态栏和导航栏也消失.

希望这对你有用.