Нижняя часть NavHostFragment скрыта за BottomNavigationView - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть макет с панелью навигации внизу и основным содержимым внутри NavHostFragment. Теперь нижняя часть NavHostFragment скрыта за панелью навигации. Как я могу это исправить?

Это основной макет действия:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@id/nav_view"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        android:layout_alignParentBottom="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

</androidx.constraintlayout.widget.ConstraintLayout>

И один из фрагментов хоста nav:

<?xml version="1.0" encoding="utf-8"?>

<androidx.core.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:isScrollContainer="true"
    app:layout_constraintTop_toTopOf="parent">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    </LinearLayout>

</androidx.core.widget.NestedScrollView>

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Вам не хватает app:layout_constraintTop_toBottomOf="@id/nav_host_fragment" на вашем nav_view - вам нужно оба направления для построения цепочки ограничений:

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/nav_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="0dp"
    android:layout_marginEnd="0dp"
    android:background="?android:attr/windowBackground"
    android:layout_alignParentBottom="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/nav_host_fragment"
    app:menu="@menu/bottom_nav_menu" />

Конечно, нет смысла использовать ConstraintLayout для этого случая - если у вас есть только вертикально сложенные, непересекающиеся представления, вы должны использовать LinearLayout.

0 голосов
/ 05 мая 2020

Добавить

android: layout_marginBottom = "55dp"

в вашем androidx.navigation.fragment.NavHostFragment

0 голосов
/ 24 марта 2020

У меня была такая же проблема, и я нашел лекарство. @ianhanniballake был прав, но это не окончательное решение. Проблема в значении 'layout_height' NavHostFragment. Вы должны пройти следующие 3 шага в activity_main. xml:

  1. Убедитесь или удалите android:paddingTop="?attr/actionBarSize" из root ConstraintLayout
  2. Add app:layout_constraintTop_toBottomOf="@id/nav_host_fragment" до
  3. Изменение в

    android:layout_height="match_parent"

до

android:layout_height="0dp"
android:layout_weight="1"

======================== ====

Небольшое исследование:

Давайте создадим проект 'Bottom Navigation Activity' с нуля.

Шаг 0.1:

добавить фон для root Activity_main. xml

android:background="@android:color/holo_green_light"

Шаг 0.2: изменить содержимое frag_home . xml на это:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_dark">

    <TextView
        android:id="@+id/left_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="L_T"
        android:background="#ffcccc"
        android:layout_gravity="start|top"
        android:textSize="120sp" />

    <TextView
        android:id="@+id/right_bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="R_B"
        android:background="#ccffcc"
        android:layout_gravity="end|bottom"
        android:textSize="120sp" />
</FrameLayout>

Вы увидите:

Шаг 1: удалить android:paddingTop="?attr/actionBarSize":

Шаг 2: Добавить ограничение app:layout_constraintTop_toBottomOf="@id/nav_host_fragment" для BottomNavigationView

Шаг 3 (окончательный) . измените высоту на 0dp и добавьте android:layout_weight="1" для NavHostFragment

PS. Надеюсь, это поможет при других подобных проблемах

...