我目前正在为我的一个活动使用沉浸式模式(API 19),如下所示:
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
| View.INVISIBLE);
这会隐藏系统按钮和通知栏,直到用户向后滑动它们。这工作正常,但是我想检测用户何时再次显示按钮。我尝试了OnSystemUiVisibilityChangeListener
,但它没有触发此特定事件。
有什么想法吗?
答案 0 :(得分:7)
从Android开发者视频中,当您处于沉浸式粘性模式时,该应用尚未得到通知。
沉浸式粘性模式从6:56开始,大约7:25罗马努里克告诉听众不会被触发。
答案 1 :(得分:4)
更新的答案:
设置OnSystemUiVisibilityChangeListener,当可见性为0(而不是6)时强制沉浸式模式。
if(android.os.Build.VERSION.SDK_INT >= 19) {
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if(visibility == 0) {
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);
}
}
});
}
老人,NASTY ANSWER:
这很讨厌,但它是一个解决方案IFF,你正在展示一个ActionBar:
if(android.os.Build.VERSION.SDK_INT >= 19) {
int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android");
((ViewGroup)findViewById(actionBarContainerId)).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android");
ViewGroup actionBarContainer = (ViewGroup) findViewById(actionBarContainerId);
if(actionBarContainer.getVisibility() == View.GONE) {
if(DEBUG) Log.d(TAG, "...PROBABLY IN IMMERSIVE MODE AND ALL IS GOOD!..");
} else {
if(DEBUG) Log.d(TAG, "...PROBABLY NO LONGER IN IMMERSIVE MODE, HEY..");
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 :(得分:4)
我找到了一个适合我的解决方案,尽管它并不完美。我将UI可见性设置为View.SYSTEM_UI_FLAG_IMMERSIVE
而不是View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
,当我收到onSystemUiVisibilityChange
回调时,我会向处理程序发送消息以重置UI可见性。这是代码:
private static final int FULL_SREEN_MSG = 10;
private static final long TIME_BEFORE_HIDE_UI = 2 * DateUtils.SECOND_IN_MILLIS;
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == FULL_SREEN_MSG) {
setFullscreen();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setFullscreen();
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this);
}
private void setFullscreen() {
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);
}
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
mHandler.sendEmptyMessageDelayed(FULL_SREEN_MSG, TIME_BEFORE_HIDE_UI);
}
}
答案 3 :(得分:1)
在4.4中,当瞬态系统条显示或自动隐藏(在IMMERSIVE_STICKY下)时,应用程序将不会通过OnSystemUiVisibilityChangeListener或其他方式接收任何指示。
您可以像system gesture listener一样听取与{{3}}类似的边缘滑动,但这不是公共API的一部分,它可能会在将来的版本中发生变化,并且会因设备而异。
我很好奇当显示/隐藏瞬态系统条时你想做什么。