以编程方式设置 AppBarLayout 子项的 minHeight

Setting minHeight of AppBarLayout's child programmatically

我想要实现的是类似于 CollapsingToolbar 的东西。我的 activity 有以下布局。

AppBarLayout 中的项目可以是可变高度。因此,我试图从 ViewTreeObserver.OnPreDrawListener.

onPreDraw() 方法中以编程方式设置项目的 minHeight

但是以编程方式设置 minHeight 似乎没有任何效果。 AppBarLayout 确实完全滚出了屏幕。直接在 XML 内设置 minHeight 会产生预期的结果并阻止 AppBarLayout 滚动出屏幕。

我是不是遗漏了什么,或者无法以编程方式设置 minHeight?

<?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"
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="false"
    >

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

       <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/header" >
            // Header of variable height
       </androidx.constraintlayout.widget.ConstraintLayout>

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

    <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_items"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_width="match_parent"
        />

</androidx.coordinatorlayout.widget.CoordinatorLayout>
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        clContent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                clContent.getViewTreeObserver().removeOnPreDrawListener(this);

                int minHeight = calculateMinHeight();
                clHeader.setMinHeight(minHeight);

                return false;
            }
        });
}

AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.app_bar); appBarLayout.setMinimumHeight(100);

你试过吗?

尝试改用 setMinimumHeight(minHeight) - 这应该可以解决问题。