gpt4 book ai didi

android - 当将 fitsSystemWindows 设置为 true 时,CollapsingToolbarLayout 中的 ViewGroup 显示额外的底部填充

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:07 25 4
gpt4 key购买 nike

我正在构建一个应用程序,其中有一个显示个人资料背景图像和其他一些元素的个人资料 fragment 。就像下面的截图:

enter image description here

我的问题是:为什么在 AppBarLayout 的末尾有一个额外的底部填充?

这是这个 fragment 的xml布局文件(我基本上是从Cheesesquare复制过来的):

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
>

<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentScrim="@android:color/white"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
>

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
>

<ImageView
android:id="@+id/profile_bg"
android:layout_width="match_parent"
android:layout_height="@dimen/height_profile_background_max"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>

<de.hdodenhof.circleimageview.CircleImageView
android:id="@id/avatar"
android:layout_width="@dimen/avatar_size_large"
android:layout_height="@dimen/avatar_size_large"
android:layout_marginStart="@dimen/horizontal_padding_normal"
app:civ_border_width="2dp"
app:civ_border_color="@android:color/white"
app:civ_border_overlay="false"
app:layout_constraintTop_toBottomOf="@id/profile_bg"
app:layout_constraintBottom_toBottomOf="@id/profile_bg"
app:layout_constraintStart_toStartOf="parent"
/>

<TextView
android:id="@id/user_display_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/vertical_padding_small"
android:layout_marginStart="@dimen/horizontal_padding_normal"
android:textSize="@dimen/text_size_medium"
android:textStyle="bold"
android:textColor="@color/text_color_normal"
app:layout_constraintTop_toBottomOf="@id/avatar"
app:layout_constraintStart_toStartOf="parent"
/>

<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/vertical_padding_small"
android:paddingBottom="@dimen/vertical_padding_normal"
android:layout_marginStart="@dimen/horizontal_padding_normal"
android:textSize="@dimen/text_size_small"
android:textColor="@color/text_color_normal"
android:maxLines="5"
app:layout_constraintTop_toBottomOf="@id/user_display_name"
app:layout_constraintStart_toStartOf="parent"
/>

<View
android:layout_width="match_parent"
android:layout_height="@dimen/vertical_divider_height"
android:background="@color/divider_background_color"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</android.support.constraint.ConstraintLayout>

<android.support.v7.widget.Toolbar
android:id="@id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:contentInsetStartWithNavigation="0dp"
app:layout_collapseMode="pin"
/>
</android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.RecyclerView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:scrollbarSize="2dp"
android:scrollbarStyle="outsideOverlay"
app:layoutManager="LinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>

</android.support.design.widget.CoordinatorLayout>

如上所示,我没有向 AppBarLayout 添加任何填充。

我将我的布局与 Cheesesquare 进行比较,发现唯一不同的是我在 AppBarLayout 中放置了一个复杂的 ConstraintLayout。 Cheesesquare 表现正常,因为它设置了特定值的 layout_height:

<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="@dimen/detail_backdrop_height"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">

当我将 AppBarLayout 的 layout_height 设置为 wrap_content 时,因为标题中的 self intro 部分可能有很多单词和它应该是 wrap_content 以确保每个句子都能显示在屏幕上。

我想知道为什么会出现这个额外的填充?仅供引用,我发现这个额外填充的高度似乎与 statusBar 的高度相同。它看起来像是与 fitsSystemWindow 属性相关的东西。如果有人能告诉我如何去除这个恼人的底部填充,那就太好了。

附言:我也为这个区域尝试了一些其他的 ViewGroup 布局,比如 LinearLayoutFramelayout,它们都是一样的,所以我很确定它与 无关ConstraintLayout 我用。

最佳答案

这个问题可能是由这个 commit 引起的

我用@Bogdan Zurac 评论的方式以编程方式修复了它。

mCollapseContentLy = findViewById(R.id.ly_collapse_content);
mCollapseContentLy.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int measuredHeight = mCollapseContentLy.getMeasuredHeight();
ViewGroup.LayoutParams lp = mCollapsingToolbarLayout.getLayoutParams();
layoutParams.height = measuredHeight;
mCollapsingToolbarLayout.setLayoutParams(lp);
mCollapseContentLy.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});

接受后编辑

创建一个新类扩展 CollapsingToolbarLayout 并覆盖 onMeasure 方法

package android.support.design.widget;

import android.content.Context;
import android.util.AttributeSet;

public class GodCollapsingToolbarLayout extends CollapsingToolbarLayout {

public GodCollapsingToolbarLayout(Context context) {
this(context, null);
}

public GodCollapsingToolbarLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public GodCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

final int mode = MeasureSpec.getMode(heightMeasureSpec);
final int topInset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
if (mode == MeasureSpec.UNSPECIFIED && topInset > 0) {
// fix the bottom empty padding
heightMeasureSpec = MeasureSpec.makeMeasureSpec(
getMeasuredHeight() - topInset, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}

关于android - 当将 fitsSystemWindows 设置为 true 时,CollapsingToolbarLayout 中的 ViewGroup 显示额外的底部填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48137666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com