Полноэкранный видеоплеер - mediacontroller за навигационной панелью

У меня проблема с mediacontroller, которая скрыта за навигационной панелью (мягкие навигационные клавиши на ICS). Сначала ОК (первое изображение), но когда панель навигации скрыта в первый раз, mediacontroller изменяется в соответствии с разрешением экрана (правильно), но не изменяется обратно при появлении навигационной панели (второе изображение). Также объявление перемещается за собой (скрыто для снимка экрана).

Если я понимаю документацию, исправление fitsSystemWindows должно отвечать за изменение размера. Но он не работает.

Как я могу это сделать? Спасибо за любую помощь.

Я тестирую это на Galaxy Nexus.

XML-макет:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/playerLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:animateLayoutChanges="true"
android:background="@color/black" >
<mynamespace.BKDVideoView
    android:id="@+id/videoview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>
<mynamespace.SubtitleTextView
    android:id="@+id/subtitleText"
    style="@style/SubtitleOverlayText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center_horizontal"
    android:layout_marginBottom="30dp"
    android:gravity="center"
    android:visibility="gone"
    android:fitsSystemWindows="true"
    android:animateLayoutChanges="true"/>
<FrameLayout
    android:id="@+id/adLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top|right"
    android:fitsSystemWindows="true"
    android:animateLayoutChanges="true"/>
<FrameLayout
    android:id="@+id/videoMediaControllerHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:animateLayoutChanges="true"/>

BKDVideoView - это копия из GrepCode VideoView с некоторыми настройками. Я сделал то же самое для MediaController. В MediaController я вызываю hidding:

int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | SYSTEM_UI_FLAG_LAYOUT_STABLE;
    if (!visible)
    {
        newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    }

    // mSystemUiHolder -> FrameLayout (playerLayout)
    mSystemUiHolder.setSystemUiVisibility(newVis);

When it's okWhen it's overlayed

Обновление. Если у вас есть такая же проблема, пожалуйста, проверьте также комментарий в принятом ответе. Для просмотров, которые должны быть полноэкранными, используйте код sammyboy. Благодаря обоим. Извините, мне нужно слишком много времени, чтобы понять это и не могу дать вам очки: (

Ответ 1

это проблема с системной панелью. В некоторых устройствах объекты fill_parent или match_parent имеют полные экраны и не распознают ширину и высоту панели. Я предлагаю: программно дать целочисленное значение представлениям. (рассчитать ширину и высоту панели). и удалите ширину или высоту sb (альбомный или портретный режим) с экрана и установите это значение в представления.

здесь ответ, как получить размеры экрана и т.д.

Ответ 2

Посмотрите на это: http://bin-liu.blogspot.no/2012/03/how-to-hide-and-display-navigation-bar.html

public void onLayoutClicked(View v) {
    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}

.

Display display = getWindowManager().getDefaultDisplay();     
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);

Ответ 3

Используйте bringToFront() для просмотра в верхней части

Ответ 4

Так как VideoView являются SurfaceView s, они не имеют того же поведения, что и обычный View. Вы должны убедиться, что он остается в фоновом режиме, указав:

videoview.setZOrderMediaOverlay(false);

Ответ 5

добавьте android:fitsSystemWindows="false" внутри рамки, содержащего обзор поверхности.

и этот код внутри вашей деятельности

your_framelayout_here.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);