Скрытие AppBarLayout и предоставление его места остальному виду

У меня довольно стандартный макет с использованием новых дизайнерских библиотек:

<AppBarLayout>
    <CollapsingToolbarLayout>
        <ImageView/>
        <Toolbar/>
    </CollapsingToolbarLayout>
</AppBarLayout>

<android.support.v4.widget.NestedScrollView/> <!-- content here -->

Я пытаюсь полностью скрыть весь AppBarLayout программным AppBarLayout, чтобы временно избавиться от Toolbar и ее коллапсирующей функции.

Поэтому я называю это:

private void disableCollapsing() {
    AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
    p.setScrollFlags(0);
    collapsingToolbarLayout.setLayoutParams(p);
}

отключить рушительное поведение (хорошо работает), и, наконец, это:

@Override
public void hide() {
    final AppBarLayout layout = (AppBarLayout) findViewById(R.id.appbar);

    layout.animate().translationY(-layout.getHeight())
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    layout.setVisibility(View.GONE);
                }
            }).start();
}

Я заставляю AppBarLayout переводить на верх (работает плавно), а в конце набора анимации View.GONE.

вопрос

В конце анимации, независимо от того, я также установил видимость GONE, я не могу получить пространство, которое ранее занимало AppBarLayout. Мой NestedScrollView остается ограниченным в нижней половине экрана, как будто AppBarLayout все еще существует (а это не так). Как я могу это исправить?

Перед укрытием:

Before

После скрытия (AppBar переведен на верх):

After

Как вы можете видеть, верхнее пространство пусто и недоступно. Вид прокрутки прокручивается внутри полей, которые у него были до этого, как будто изменение видимости не было измерено CoordinatorLayout.

  • Я пробовал позвонить coordinator.requestLayout(), без успеха.

  • Я также попытался установить AppBarLayout в качестве app:anchor для моего NestedScrollView, но это закручивает вещи - просмотр прокрутки заканчивается тем, что весь экран еще до того, как он скрывается.

  • Я думал о настраиваемом Behavior должно быть установлено в представлении прокрутки при входе в этот скрытый режим AppBar, но я не могу начать с этого.

Ответ 1

Да, это похоже на ошибку, я решил эту проблему для моего приложения, установив высоту панели приложения 0:

android.support.design.widget.AppBarLayout appbar = (android.support.design.widget.AppBarLayout) findViewById(R.id.appbar);

CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();

lp.height = 0;

appbar.setLayoutParams(lp);

Ответ 2

Следующие работы также

appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);

Ответ 3

Это работает для меня. Просто включает/выключает панель приложений.

private boolean hide = true;
public void toggleAppBar() {

    // Calculate ActionBar height
    TypedValue tv = new TypedValue();
    int actionBarHeight = 0;
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
    }


    CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams();
    lp.height = hide ? 0 : actionBarHeight;
    appBarLayout.setLayoutParams(lp);
    appBarLayout.setExpanded(!hide, true);

    hide = !hide;

appbar_layout.xml

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/content_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>