Скрытие 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 все еще существует (а это не так). Как я могу это исправить?
Перед укрытием:
После скрытия (AppBar переведен на верх):
Как вы можете видеть, верхнее пространство пусто и недоступно. Вид прокрутки прокручивается внутри полей, которые у него были до этого, как будто изменение видимости не было измерено 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>