当前位置: 首页 > 知识库问答 >
问题:

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

东龙野
2023-03-14
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;
    }

}

第一次启动后

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

我看到QuickPic应用程序没有这个bug。我不知道他们怎么会漏掉它。

共有3个答案

封锐藻
2023-03-14

我也有同样的问题,我用一个简单的解决方法解决了它。尽管我找不到这种解决方法的理论原因,但它对我还是有效的。

似乎当按下音量按钮时,与“沉浸模式”相关的“标志”被清除。我认为这就是为什么沉浸式模式被禁用,而沉浸式模式不会自动恢复的原因。

因此,我试图在按下带有“可运行”对象的音量按钮后设置“标志”。

所以,它是这样工作的:

沉浸式模式-

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

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

private Handler mHandler = new Handler();

...

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

我只是无缘无故地延迟了500毫秒,这并不重要。

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

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

    if(hasFocus) 
    {
        mHandler.post(decor_view_settings);
    }
}

它在我的应用程序上运行得非常好。

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

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

希望这对你有用。

令狐嘉运
2023-03-14

我的解决方案是在三个位置设置UI可见性标志:

  1. 获得焦点时

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

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

setupMain WindowDisplayMode()在oncreate()中被调用。

劳华灿
2023-03-14

以下代码适用于我:

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

并调用oncreateonResume方法上的侦听器:

java prettyprint-override">@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    updateUI();
}

@Override
public void onResume() {
    super.onResume();
    updateUI();
}
 类似资料:
  • 所以我有一个活动,我希望它全屏显示,显示标题栏和系统按钮(后退,最小化…)。我确实从开发人员那里获取了一段代码。Androidcom,它确实会全屏显示,但当我按下屏幕时,标题会弹回来,按钮也会弹出来,我希望只有当我的手指在屏幕的上/下滑动时,它才会弹出。 我的活动看起来像:

  • 我想隐藏导航栏。如果使用者从外到内给手指下药,请出示。我测试以下代码: 怎么能把这三项加起来呢?我所缺少的。

  • 在全屏沉浸式模式下,是否可以禁用打开主导航栏的左滑动手势,以便只能从顶部滑动打开它?在开发全屏游戏时,必须围绕防止用户意外打开它进行如此繁重的设计,这非常烦人。 提前感谢。 编辑: 很抱歉只是为了澄清我说的是一个水平锁定的全屏游戏,在沉浸式模式下,禁用使主android导航栏/通知栏出现的左滑动手势,我希望有一种方法可以只让它打开通过从顶部滑动。

  • 我已经成功地将应用程序设置为沉浸式模式,因为我想要隐藏状态栏(在顶部屏幕上)和导航栏(在底部屏幕上)。问题是,当活动改变时,底部条自动出现,并立即下降和消失。我想避免这件事。 所有活动都在清单中设置了AppTheme.NoActionBar样式:

  • 我正在尝试进入沉浸式模式,使用 工具栏部分隐藏在状态栏后面。那么我如何使工具栏再次正确地出现呢?

  • 本文向大家介绍Android沉浸式状态栏微技巧(带你真正理解沉浸式模式),包括了Android沉浸式状态栏微技巧(带你真正理解沉浸式模式)的使用技巧和注意事项,需要的朋友参考一下  其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发起的。因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模式(Immersive Mode)这种说法。而有些人在没有完全了解清楚