вид снизу ниже RecyclerView в CoordinatorLayout на Android

Я переключился с ConstraintLayout на CoordinatorLayout, чтобы избежать перекрытия закусочной с моим видом снизу. Хотя он работал очень хорошо на экране только с панелью инструментов, RecyclerView и плавающей кнопкой, на втором экране мне очень трудно добавить представление под RecyclerView, избегая при этом его перекрытия с RecyclerView

Мое лучшее решение (ниже) заключалось в том, чтобы добавить paddingBottomattribute примерно 80dpв recyclerView. Похоже, это решает проблему, но когда закусочная находится в ВВЕРХ, нижний вид android:id="@+id/item_cl_add" снова будет перекрываться с recyclerView. Конечно, я могу добавить больше paddingBottom, чтобы компенсировать размер закусочной, но это означает, что я потеряю около 20dp недвижимости (плохая идея).

Я проверил много веб-сайтов, но не смог найти простого решения.

ниже мой последний код, который все еще перекрывается на закусочной

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/item_col_top"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".item.ItemActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <include
        android:id="@+id/item_toolbar"
        layout="@layout/toolbar" />
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/item_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="60dp"
        android:layout_marginTop="8dp"
        tools:listitem="@layout/list_item"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>


    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/item_cl_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        app:layout_dodgeInsetEdges="bottom"
        android:layout_gravity="bottom">

        <AutoCompleteTextView
            android:id="@+id/item_ac_add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp"
            android:hint="@string/item_edit_text_hint"
            android:imeOptions="actionDone"
            android:inputType="text"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/item_b_add"
            app:layout_constraintTop_toTopOf="parent"
            tools:targetApi="o" />

        <Button
            android:id="@+id/item_b_add"
            android:layout_width="42dp"
            android:layout_height="42dp"
            android:layout_marginStart="8dp"
            android:background="@color/colorForeground"
            android:stateListAnimator="@null"
            android:text="+"
            android:textColor="@android:color/black"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Ниже приведен скриншот без закусочной (Хорошо).

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

Ниже приведен снимок экрана с закусочной (не очень хорошо).

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


person epic    schedule 25.03.2020    source источник
comment
Не могли бы вы предоставить скриншот.?   -  person yash786    schedule 25.03.2020
comment
добавил скриншот   -  person epic    schedule 25.03.2020


Ответы (1)


CoordinatorLayout похож на FrameLayout в том смысле, что представления могут свободно перекрываться. Таким образом, прокладки не могут решить проблему.

Если вы не хотите, чтобы вид ресайклера перекрывался с нижним видом, вы должны обернуть их оба вертикальным LinearLayout.

person jmart    schedule 25.03.2020
comment
Спасибо за ответ, но, пожалуйста, поправьте меня, если я ошибаюсь, чтобы избежать перекрытия закусочной панели нижнего вида, мне нужно поместить app:layout_dodgeInsetEdges="bottom" в LineraLayout, и это приведет к тому, что закусочная вытолкнет весь LinearLayout за панель инструментов, и я не буду см. первый ряд, пока закусочная не закроется. Могу ли я в любом случае избежать этого? - person epic; 25.03.2020
comment
Если вы хотите избежать этого, я бы вернулся к предыдущей настройке (без линейного макета) и добавил белый фон в вид снизу. Таким образом, нижний вид выдвигается вверх за счет закусочной, но вид recyclerview остается на месте (в основном, это то, что вы сделали на втором снимке экрана, но теперь фон нижнего вида скрывает перекрытие). - person jmart; 25.03.2020
comment
Я также думал об этом, но это все равно будет перекрывать последнюю строку, когда закусочная ВВЕРХ. Это так странно, поскольку кажется, что все учебники предлагают использовать макет координатора, чтобы избежать перекрытия закусочной, но нет хорошего решения для таких представлений, как перекрытие recyclerView. - person epic; 26.03.2020
comment
Другой вариант, который вы можете попробовать, — оставить вид снизу привязанным к нижней части экрана и сделать закусочную панель над ним. Для этого вам нужно взять нижний вид из CoordinatorLayout и обернуть их оба в LinearLayout. Но я не знаю, служит ли это твоим целям. - person jmart; 26.03.2020
comment
В итоге я вернулся с CoordinatorLayout на ConstraintLayout. Чтобы закусочная не перекрывала вид снизу, я создал функцию обратного вызова для закусочных onShown и onDismissed. Пока закусочная работает, я добавляю layout_marginBottom из mSnackbar.getView().getHeight(), а затем удаляю ее. Кажется, это работает хорошо, но я продолжу тестирование, я больше всего беспокоюсь, так как не вижу такого подхода в Интернете. - person epic; 26.03.2020