Как избежать наложения панели навигации на панель поиска видео

У меня есть видеоактивность с заголовком вверху и SeekBar с элементами управления мультимедиа внизу. И заголовок, и SeekBar макеты накладываются на SurfaceView при запуске события касания и исчезают через определенное время. Я также внедряю иммерсивный режим, в котором панели состояния и навигации исчезают вместе с заголовком и SeekBar. Мне удалось освободить место для отображения строки состояния без наложения на макет заголовка, используя атрибут ниже.

android:fitsSystemWindows="true"

Но если я использую тот же атрибут для макета элементов управления мультимедиа в нижней части экрана, это не сработает. В результате панель навигации накладывается на макет. Я не мог понять, почему указанный выше атрибут работает нормально на одном макете, а не на другом. У меня есть индивидуальный макет для элементов управления мультимедиа, у меня есть класс, который расширяет FrameLayout. Атрибут fitSystemWindows не работает для настраиваемых макетов? См. значок в правом нижнем углу на первом снимке экрана. Он перекрывается панелью навигации, как показано на втором снимке экрана.

введите здесь описание изображения

Я включил часть моего файла класса и макета ниже.

MediaController.java

public class MediaController extends FrameLayout {

    //Some private fields are declared here

    public MediaController(Context context, boolean useFastForward, boolean useFullScreenButton) {
        super(context);
        ....
    }

    public MediaController(Context context) {
        this(context, true, false);
    }

    @Override
    public void onFinishInflate() {
        if (mRoot != null)
            initControllerView(mRoot);
    }

    //Inflating the layout here
    protected View makeControllerView() {
        LayoutInflater inflate = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mRoot = inflate.inflate(R.layout.media_controller, null);
        ....
        return mRoot;
    }

    //Lot of other methods here

}

media_controller.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:fitsSystemWindows="true"> <!--Using the attribute here-->

    <ImageButton android:id="@+id/pause"
        android:layout_gravity="top"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@android:color/transparent"/>

    <TextView android:id="@+id/time_current"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/white"/>

    <SeekBar
        android:id="@+id/mediacontroller_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="32dip" />

    <TextView android:id="@+id/time"
        android:layout_gravity="center_horizontal"
        android:textColor="@color/white"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <ImageButton android:id="@+id/fullscreen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:contentDescription="@string/description" />

</LinearLayout>


person Prudhvi    schedule 01.09.2015    source источник
comment
Я настоятельно рекомендую вам поделиться коротким видео (или скриншотом) с проблемой, а затем объяснить, как это должно работать.   -  person Nactus    schedule 01.09.2015
comment
@Nactus Я добавил скриншоты. Спасибо.   -  person Prudhvi    schedule 01.09.2015
comment
См. значок в правом нижнем углу на первом снимке экрана. Она перекрывается панелью навигации, как показано на втором снимке экрана, поэтому, если я правильно вас понял, вы хотели бы скрыть панель навигации, когда ваш медиаплеер активен, верно? (первое изображение — это то, как это должно выглядеть, а второе — то, что у вас получилось, верно?)   -  person Nactus    schedule 01.09.2015
comment
Я мог бы скрыть это, но когда я касаюсь экрана, я получаю то, что вы могли видеть на 2-м изображении. Единственное, чего я не хочу, так это того, чтобы панель навигации накладывалась на правый нижний значок. Значок должен переместиться влево от панели навигации.   -  person Prudhvi    schedule 01.09.2015


Ответы (1)


Если вам не нужна навигационная панель, скройте ее следующим образом:

// onResume ensures that every time the application is resumed, the nav bar goes away
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    protected void onResume() {

        super.onResume();

        View decorView = getWindow().getDecorView();
        //int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

Кроме того, проверьте это:

В Android 4.1 и более поздних версиях вы можете настроить отображение содержимого вашего приложения за панелью навигации, чтобы размер содержимого не изменялся при скрытии и отображении панели навигации. Для этого используйте SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION. Вам также может понадобиться использовать SYSTEM_UI_FLAG_LAYOUT_STABLE, чтобы помочь вашему приложению поддерживать стабильный макет.

Когда вы используете этот подход, вы несете ответственность за то, чтобы важные части пользовательского интерфейса вашего приложения не закрывались системными панелями. Более подробное обсуждение этой темы см. в уроке «Скрытие строки состояния».

person Nactus    schedule 01.09.2015