Пользовательское поведение BottomSheet - выше BottomBar

1

Я хочу показать BottomSheet над моим BottomBar. Поэтому я должен написать пользовательский BottomSheet behavior, который поместит мой BottomSheet выше моего BottomBar - BottomBar имеет shy behavior (запрет во время прокрутки).

Я попытался реализовать:

public class BottomSheetBehavior<T extends View> extends android.support.design.widget.BottomSheetBehavior<T> {

public BottomSheetBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
    return dependency instanceof BottomBar;
}

@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
    // This will set the Y of my bottom sheet above the bottom bar every time BottomBar changes its position
    child.setY(dependency.getY() - child.getHeight());
    // But I also have to modify the bottom position of my BottomSheet 
    // so the BottomSheet knows when its collapsed in its final bottom position.
    child.setBottom((int) dependency.getY() - dependency.getHeight());
    return false;
}

}

До сих пор это решение не полностью работало. Я могу поставить BottomSheet выше BottomBar с помощью метода setY(). Но разрастание и разрушение работают неправильно. Поэтому я попытался изменить нижнюю часть BottomSheet с помощью метода setBottom() Но он не работает ни один. Возможно, это из-за неправильных единиц (px vs dp).

Может ли кто-нибудь помочь мне исправить мой код или хотя бы дать мне какой-то намек, что именно я делаю неправильно или что мне не хватает?

Теги:
android-layout
material-design
android-coordinatorlayout
bottom-sheet

1 ответ

1
Лучший ответ

Итак, я вышел своим решением. Он работает отлично, хотя были некоторые проблемы, которые нужно было решить - например, тень выше BottomBar или хэширование BottomBar, когда BottomSheet является экспансионом и т.д.

Для тех, кто сталкивается с той же или подобной проблемой, есть мое решение.

public class MyBottomSheetBehavior<T extends View> extends android.support.design.widget.BottomSheetBehavior<T> {

    private boolean mDependsOnBottomBar = true;

    public MyBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, T child, View dependency) {
        return (dependency instanceof BottomBar) || super.layoutDependsOn(parent, child, dependency);
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, T child, View dependency) {
        if (dependency instanceof BottomBar) {

            BottomBar bottomBar = (BottomBar) dependency;

            if (mDependsOnBottomBar) {
                //TODO this 4dp margin is actual shadow layout height, which is 4 dp in bottomBar library ver. 2.0.2
                float transitionY = bottomBar.getTranslationY() - bottomBar.getHeight()
                    + (getState() != STATE_EXPANDED ? Utils.dpToPixel(ContextProvider.getContext(), 4L) : 0F);
                child.setTranslationY(Math.min(transitionY, 0F));
            }

            if (bottomBar.getTranslationY() >= bottomBar.getHeight()) {
                mDependsOnBottomBar = false;
                bottomBar.setVisibility(View.GONE);
            }
            if (getState() != STATE_EXPANDED) {
                mDependsOnBottomBar = true;
                bottomBar.setVisibility(View.VISIBLE);
            }

            return false;
        }
        return super.onDependentViewChanged(parent, child, dependency);
    }
}
  • 0
    Как бы вы изменили высоту Bottom Bar или Bottom Sheet вместо перевода x или y? Я ищу способ гарантировать, что мой контейнер с фрагментами не будет покрыт моим Нижним листом, когда Нижний лист находится в свернутом состоянии. Любые мысли приветствуются!
  • 0
    Как вы настраиваете свое поведение на нижнем листе?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню