隐藏AppBarLayout并将其空间分配给剩余视图

时间:2015-06-16 18:53:04

标签: android android-layout android-design-library android-coordinatorlayout

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

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();
}

禁用折叠行为(效果很好),最后是:

View.GONE

我将AppBarLayout翻译为顶部(工作顺利),并在动画集的末尾显示AppBarLayout的可见性。

问题

在动画结束时,无论我是否也将可见性设置为GONE,我都无法获得之前被CoordinatorLayout占用的空间。我的NestedScrollView仍然局限在屏幕的下半部分,好像AppBarLayout仍在那里(不是)。我该如何解决?

隐藏之前:

Before

隐藏后(AppBar翻译到顶部):

After

正如您所看到的,顶部空间是空的,无法访问。滚动视图在其前面的边距内滚动,就好像coordinator.requestLayout()未测量可见性变化一样。

  • 我尝试过调用app:anchor,但没有成功。

  • 我也尝试将AppBarLayout设置为我的NestedScrollView的Behavior,但这会搞砸 - 滚动视图最终会在隐藏之前占据整个屏幕。

  • 我在考虑在输入 hidden-AppBar模式时在滚动视图上设置自定义{{1}},但我无法开始使用

4 个答案:

答案 0 :(得分:18)

是的,这看起来像一个bug,我为我的应用程序解决了这个问题,将appbar height设置为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);

答案 1 :(得分:1)

以下作品

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

答案 2 :(得分: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>

答案 3 :(得分:0)

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

    val appBarLayout = activity?.findViewById<AppBarLayout>(R.id.app_bar_layout)
    val lp = appBarLayout?.layoutParams
    lp?.height = 0;
    appBarLayout?.layoutParams = lp
相关问题