Android 在全屏模式下,在平板电脑上重复调暗状态栏(系统\用户界面\标志\低姿态)?

Android 在全屏模式下,在平板电脑上重复调暗状态栏(系统\用户界面\标志\低姿态)?,android,user-interface,tablet,statusbar,Android,User Interface,Tablet,Statusbar,我知道如何在Android平板电脑上调暗状态栏。我使用该代码执行此操作: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 它工作正常,但只工作一次。当我触摸状态栏时,它会激活,之后我回到应用程序的活动中时,状态栏仍会激活(用图标代替点)。我尝试登录Resume调用,但它没有被调用,所以我再次搜索并找到了另一个解决方案-使用处理程序更改状态栏的可见性: getWindow().g

我知道如何在Android平板电脑上调暗状态栏。我使用该代码执行此操作:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
它工作正常,但只工作一次。当我触摸状态栏时,它会激活,之后我回到应用程序的活动中时,状态栏仍会激活(用图标代替点)。我尝试登录Resume调用,但它没有被调用,所以我再次搜索并找到了另一个解决方案-使用处理程序更改状态栏的可见性:

getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
    }
});
它有时能工作,但几次尝试后就坏了

我需要这个游戏-理论上,我可以尝试在每次触摸后或每次在主循环中调用它,但这似乎是个坏主意(此外,它必须从特定线程调用-只有创建视图层次结构的原始线程才能触摸其视图)


我的问题是:实现状态栏自动调暗的最佳方式是什么?或者,在我的情况下,任何方式。

我也遇到过这个问题(除了隐藏导航标志),谷歌似乎天生就禁用了不断隐藏/调暗系统栏的功能。我同意你的观点,不断调用该方法可能会在线程上失败或导致性能问题,特别是考虑到移动设备上发生了如此多的ontouch事件


归根结底,我认为没有解决方案,除非用户将其设备根化以永久删除系统栏。

解决方案是在根视图上拥有一个视图。onsystemivilitychangelister

当事件触发时,您必须等待一段时间才能再次使其变暗。计时器会很合适

private class MySystemUiVisibilityChangeListener implements View.OnSystemUiVisibilityChangeListener {

    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                MyActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mRootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);                           
                    }
                });
            }
        }, 1000);
    }

}

我稍微改变了Karanlos的回答:

Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
    AudioRecordTest.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (ivIndicator.getVisibility() == View.VISIBLE)
                ivIndicator.setVisibility(View.INVISIBLE);
            else if (ivIndicator.getVisibility() == View.INVISIBLE)
                ivIndicator.setVisibility(View.VISIBLE);
            }
        });
    }
};

timer.scheduleAtFixedRate(task, 0, 500);

您不需要创建新类或实现任何东西。只需像他的回答一样制作一个
TimerTask
,并使用
scheduleAtFixedRate(task,delay,period)
对其进行调度,此方法将以毫秒为单位,每隔
时间段运行
TimerTask

不确定这在2012年是否可用,但现在可以使用活动的
onWindowFocusChanged()
回调:

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE
}

你把
getWindow().getDecorView().setSystemMiviability(视图、系统、用户界面、标志、低姿态)放在哪里
,如果您将其放入
onCreate
,尝试将其移动到
onResume
,查看是否helps@Wenhui:正如我所说,onResume没有被调用(因为onPause也没有被调用-活动在点击状态栏后一直处于“活动”状态)-为了确保我将此代码移动到onResume并再次测试-这没有帮助,所以我仍然不知道如何实现这一点。我可以确认这对我来说是有效的,我找到的所有其他解决方案都没有。好吧,它工作了,但只有在最初和触摸主页按钮并取消它时。在游戏视图中再次单击时不会。