Показать пример с Immersive Mode в Android приложении

Цена договорная • электронные деньги
10 сентября 2016, 01:17 • 1 отклик • 14 просмотров
Нужен работающий пример с Immersive Mode, описание этого мода здесь https://habrahabr.ru/post/200874/
Не получается нормально внедрить этот мод в приложение, приложение переходит в полноэкранный режим нормально, но при обратном выходе интерфейс оказывается под системными панелями, в статье указано, что можно для рутового элемента указать атрибут fitWindow, но в таком случае при выходе образуется черная полоса размером в верхний LinearLayout в моей разметке (paneltop в примере).

Приложил файл с разметкой. В моем случае переход в полноэкранный immersive mode переходит при двойном тапе по SurfaceView.

Групповые элементы приложения я скрываю, чтобы развернуть SurfaceView на всю область и возвращаю их обратно при переходе в обычный режим, вот эти панели оказываются под системными панелями (статус бар и кнопки):
public void HideElements() {
paneltop.setVisibility(View.GONE);
panelbottom.setVisibility(View.GONE);
mExpandableListView.setVisibility(View.GONE);
}

public void ShowElements() {
paneltop.setVisibility(View.VISIBLE);
panelbottom.setVisibility(View.VISIBLE);
mExpandableListView.setVisibility(View.VISIBLE);
}

так выглядит метод перехода в полноэкранку (код использования immersive mode здесь закомментирован):
public void setFullScreen() {
if (player != null) {

if (!mFullScreen) {
//if (Build.VERSION.SDK_INT < 19) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
HideElements();
/* }
else {
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_LOW_PROFILE
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}*/
setFullscreenSurfaceSize();
mFullScreen = true;
} else {
//if (Build.VERSION.SDK_INT < 19) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
ShowElements();
/* }
else {
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}*/

setNormalSurfaceSize();
mFullScreen = false;
}
}
}

данный метод вызывается при двойном тапе по SurfaceView:

videoSurface = (SurfaceView) findViewById(R.id.videoSurface);
videoSurface.setClickable(true);
final GestureDetector clickDetector = new GestureDetector(this,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
controller.show();
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
setFullScreen();
controller.show();
return true;
}
});
videoSurface.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return clickDetector.onTouchEvent(motionEvent);
}
});


Файлы