6

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

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);

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

getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
    }
});

它有时会起作用,但经过几次尝试后它就会崩溃。

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

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

4

4 回答 4

2

一个解决方案是在你的根视图上有一个 View.OnSystemUiVisibilityChangeListener 。

当事件触发时,您必须等待一段时间才能再次使它们变暗。计时器将是合适的。

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

}
于 2013-01-22T22:54:28.550 回答
0

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

最终,我认为没有解决方案,除非用户将他们的设备植根以永久删除系统栏。

于 2013-01-18T17:24:16.493 回答
0

我稍微改变了 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一次period

于 2013-06-02T15:33:10.907 回答
0

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

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE
}
于 2019-06-18T09:04:54.453 回答