23

我使用新的设计库有一个非常标准的布局:

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

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

我想要做的是完全以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,但这搞砸了——滚动视图甚至在隐藏之前就占据了整个屏幕。

  • 进入此hidden-AppBar 模式时,我正在考虑Behavior在滚动视图上设置一个自定义,但我无法开始。

4

4 回答 4

24

是的,这看起来像一个错误,我为我的应用程序将 appbar 高度设置为 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);
于 2015-11-11T14:59:59.653 回答
0

感谢@Caleb Kleveter,这是我的 Kotlin 代码

    val appBarLayout = activity?.findViewById<AppBarLayout>(R.id.app_bar_layout)
    val lp = appBarLayout?.layoutParams
    lp?.height = 0;
    appBarLayout?.layoutParams = lp
于 2021-01-07T06:07:06.970 回答
0

这对我有用。只需打开/关闭应用栏。

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>
于 2019-08-15T04:45:47.730 回答
-2

以下也有效

appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);
于 2016-06-23T05:55:21.653 回答