Como BottomSheetBehavior, AppBarLayout.ScrollingViewBehavior e AppBarLayout.Behavior podem trabalhar juntos em uníssono?

No GIF abaixo, você verá que estou tendo problemas para coordenar (heh) umAppBarLayout, contendo umCollapsingToolbarLayoute umPersistent BottomSheet de tal maneira que eles tocam bem juntos

Objetivo: Tenha oconteúdo do fragmento, visto acima em turquesa (# 26999f), permaneça acima, e role para trás, a BottomSheet, vista acima em verde escuro(# 12783e), respeitando também o AppBarLayout e seu comportamento

Novamente, como você pode ver no GIF, estou perto; o conteúdo do fragmento está usando umlayout_behavior personalizado, MyScrollingViewBehavior, que se estendeAppBarLayout.ScrollingViewBehavior

No snippet de código abaixo, você veráMyScrollingViewBehavior#layoutDependsOn retornatrue se odependency é uma instância de umRelativeLayout (The BottomSheet neste exemplo) ou o que forsuper (AppBarLayout.ScrollingViewBehavior#layoutDependsOn) depende de

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

DentroMyScrollingViewBehavior#onDependentViewChanged se odependency é uma instância de umRelativeLayout, significando que a dependência é BottomSheet, o filho, também conhecido como conteúdo do fragmento, é movido para cima ou para baixo usandooffsetTopAndBottom para garantir que permaneça acima da BottomSheet

@TargetApi(VERSION_CODES.LOLLIPOP)
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
    if (dependency instanceof RelativeLayout) {
        RelativeLayout bottomSheet = (RelativeLayout) parent.findViewById(R.id.bottom_sheet);
        int bottomSheetHeight = (bottomSheet.getTop() - child.getBottom());
        ViewCompat.offsetTopAndBottom(child, bottomSheetHeight);
    }
    super.onDependentViewChanged(parent, child, dependency);
    return false;
}

O exemplo de código completo pode ser encontradono Github aqui. Além disso, esta pergunta é uma continuação e uma melhoria esperançosa deminha pergunta original aqui

questionAnswers(0)

yourAnswerToTheQuestion