android -> 将 ImageView 的高度设置为父级的动态高度
Posted
技术标签:
【中文标题】android -> 将 ImageView 的高度设置为父级的动态高度【英文标题】:android -> set height of ImageView to dynamic height of parent 【发布时间】:2021-03-24 08:35:56 【问题描述】:我有动态高度的单元格的 recyclerview。 单元格的高度取决于文本的长度。
我想为这个单元格设置背景封面。 ImageView 的高度必须与父视图的高度相同。 令人惊讶的是,完成这项任务真的很难。
这是没有 ImageView 的结果布局
如您所见,单元格的高度取决于文本的长度。
使用 ImageView 的结果布局。
如您所见,单元格的高度取决于图像高度。
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardview"
app:cardBackgroundColor="#FF6B6B"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_
android:layout_
app:cardCornerRadius="8dp">
<FrameLayout
android:layout_
android:layout_>
<ImageView
android:src="@drawable/universe1"
android:id="@+id/background"
android:layout_
android:layout_
android:scaleType="centerCrop">
</ImageView>
<LinearLayout
android:id="@+id/layout_text"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:layout_marginLeft="8dp"
android:textColorLink="@color/white"
android:layout_marginBottom="8dp"
android:id="@+id/text"
android:layout_
android:layout_
android:layout_marginTop="2dp"
android:ellipsize="end"
android:fontFamily="@font/compact_text_regular"
android:maxLines="4"
android:text="This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah"
android:textColor="@color/white"
android:textSize="14sp"
android:lineSpacingExtra="4dp" />
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<LinearLayout
android:visibility="gone"
android:id="@+id/like_icon_wrap"
android:clickable="true"
android:layout_gravity="center"
android:layout_
android:layout_
android:orientation="horizontal">
<ImageView
android:layout_marginLeft="8dp"
android:id="@+id/like_icon"
android:layout_gravity="center_vertical"
android:layout_
android:layout_
app:srcCompat="@drawable/heart_white" />
<TextView
android:id="@+id/likes_count"
android:layout_gravity="center"
android:layout_
android:layout_
android:fontFamily="@font/compact_text_regular"
android:textColor="@color/white"
android:textSize="16sp"
android:text="0" />
</LinearLayout>
<TextView
android:layout_marginRight="8dp"
android:layout_gravity="center"
android:id="@+id/more"
android:layout_
android:layout_
android:layout_weight="1"
android:fontFamily="sans-serif"
android:textColor="@color/colorPrimary"
android:gravity="right"
android:text="show more"
android:textSize="12sp"
android:visibility="invisible" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
</androidx.cardview.widget.CardView>
我也尝试从 recyclerview 适配器设置图像高度,但没有成功。
【问题讨论】:
【参考方案1】:使用ConstraintLayout
,您可以通过将高度设置为0dp
并将顶部/底部限制到您要匹配的另一个视图来匹配另一个视图高度
我剪掉了布局的其他部分,因此您必须添加它们,但下面是图像和文本的代码。 Produce this
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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:id="@+id/cardview"
app:cardBackgroundColor="#FF6B6B"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_
android:layout_
app:cardCornerRadius="8dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_
android:layout_>
<ImageView
android:id="@+id/background"
android:layout_
android:layout_
tools:src="@tools:sample/avatars"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="@id/text"
app:layout_constraintEnd_toEndOf="@id/text"
app:layout_constraintTop_toTopOf="@id/text"
app:layout_constraintBottom_toBottomOf="@id/text" />
<TextView
android:id="@+id/text"
android:layout_
android:layout_
android:ellipsize="end"
android:lineSpacingExtra="4dp"
android:maxLines="4"
android:text="This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah"
android:textSize="14sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
【讨论】:
【参考方案2】:正确的方法是使用@Håkon Schia 代码。 但是如果你想使用 FrameLayout 然后像这样在 RelativeLayout 中添加它,并在其中添加 ImageView 并带有“alignBottom”约束:
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardview"
app:cardBackgroundColor="#FF6B6B"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_
android:layout_
app:cardCornerRadius="8dp">
<!--
Code added here...
-->
<RelativeLayout
android:layout_
android:layout_>
<ImageView
android:id="@+id/background"
android:background="@drawable/universe1"
android:layout_
android:layout_
android:layout_alignBottom="@+id/frameLayout"
android:scaleType="centerCrop">
</ImageView>
<FrameLayout
android:id="@+id/frameLayout"
android:layout_
android:layout_>
<!--<ImageView
android:src="@drawable/universe1"
android:layout_
android:layout_
android:scaleType="centerCrop">
</ImageView>-->
<LinearLayout
android:id="@+id/layout_text"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:layout_marginLeft="8dp"
android:textColorLink="@color/white"
android:layout_marginBottom="8dp"
android:id="@+id/text"
android:layout_
android:layout_
android:layout_marginTop="2dp"
android:ellipsize="end"
android:fontFamily="@font/compact_text_regular"
android:maxLines="4"
android:text="This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah"
android:textColor="@color/white"
android:textSize="14sp"
android:lineSpacingExtra="4dp" />
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<LinearLayout
android:visibility="gone"
android:id="@+id/like_icon_wrap"
android:clickable="true"
android:layout_gravity="center"
android:layout_
android:layout_
android:orientation="horizontal">
<ImageView
android:layout_marginLeft="8dp"
android:id="@+id/like_icon"
android:layout_gravity="center_vertical"
android:layout_
android:layout_
app:srcCompat="@drawable/heart_white" />
<TextView
android:id="@+id/likes_count"
android:layout_gravity="center"
android:layout_
android:layout_
android:fontFamily="@font/compact_text_regular"
android:textColor="@color/white"
android:textSize="16sp"
android:text="0" />
</LinearLayout>
<TextView
android:layout_marginRight="8dp"
android:layout_gravity="center"
android:id="@+id/more"
android:layout_
android:layout_
android:layout_weight="1"
android:fontFamily="sans-serif"
android:textColor="@color/colorPrimary"
android:gravity="right"
android:text="show more"
android:textSize="12sp"
android:visibility="invisible" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
【讨论】:
以上是关于android -> 将 ImageView 的高度设置为父级的动态高度的主要内容,如果未能解决你的问题,请参考以下文章