Android布局求助:venueName文本被surface遮挡无法显示
解决Android布局中venueName被遮挡的问题
问题原因
你遇到的问题根源有两个:
surface这个MaterialCardView在XML中的声明顺序在venueName等文本控件之后,ConstraintLayout里后声明的控件默认绘制层级更高,会直接覆盖前面的控件。surface的约束设置错误,它的顶部绑定到title下方,且高度设为600dp,直接覆盖了下方的场地信息区域。
解决方案
步骤1:调整surface的声明位置
把surface控件移到所有场地信息文本控件(venueInfo、venueNameLabel、venueName等)的前面,这样文本控件会在surface上方绘制,不会被遮挡。
步骤2:修正surface的约束
将surface的顶部约束改为绑定到场地信息区域下方的divider_控件,避免覆盖场地信息内容。
修改后的完整XML代码
<?xml version="1.0" encoding="utf-8"?> <androidx.core.widget.NestedScrollView 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"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/backdrop" android:layout_width="match_parent" android:layout_height="300dp" android:scaleType="centerCrop" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <!-- 移到此处:在文本控件之前声明,避免覆盖 --> <com.google.android.material.card.MaterialCardView android:id="@+id/surface" android:layout_width="match_parent" android:layout_height="600dp" app:cardCornerRadius="12dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" <!-- 修改顶部约束到场地信息区域下方 --> app:layout_constraintTop_toBottomOf="@id/divider_" /> <RatingBar android:id="@+id/venueRating" style="@style/Widget.AppCompat.RatingBar.Small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:elevation="4dp" android:isIndicator="true" android:numStars="5" android:progressTint="@color/colorRating" android:rating="3.5" android:scaleX="1.5" android:scaleY="1.5" app:layout_constraintBottom_toBottomOf="@id/ratingValue" app:layout_constraintEnd_toEndOf="@id/title" app:layout_constraintStart_toEndOf="@id/ratingValue" app:layout_constraintTop_toTopOf="@id/ratingValue" /> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="64dp" android:layout_marginTop="24dp" android:layout_marginEnd="64dp" android:elevation="4dp" android:ellipsize="end" android:fontFamily="@font/chivo_bold" android:maxLines="1" android:textAlignment="center" android:textColor="@android:color/background_dark" android:textSize="22sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/imageContainer" tools:text="Taylor Swift" /> <TextView android:id="@+id/ratingValue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:elevation="4dp" android:fontFamily="@font/rubik_one" android:letterSpacing="-0.1" android:textColor="@color/primaryTextColor" android:textSize="36sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="@id/imageContainer" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/title" tools:text="4.2" /> <TextView android:id="@+id/event_taxonomies" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="64dp" android:layout_marginTop="24dp" android:layout_marginEnd="64dp" android:elevation="4dp" android:ellipsize="end" android:gravity="center|center_horizontal|center_vertical" android:letterSpacing="-0.1" android:textAlignment="center" android:textColor="@color/primaryTextColor" android:textSize="14sp" android:textStyle="italic" app:layout_constraintEnd_toEndOf="@id/venueRating" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/venueRating" /> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="@dimen/half_default_margin" android:background="?android:attr/listDivider" app:layout_constraintTop_toBottomOf="@+id/event_taxonomies" /> <TextView android:id="@+id/venueInfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="32dp" android:elevation="4dp" android:fontFamily="@font/chivo_bold" android:text="@string/head_venueInfo" android:textAlignment="center" android:textColor="@android:color/background_dark" app:layout_constraintEnd_toEndOf="@id/divider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/divider"/> <TextView android:id="@+id/venueNameLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="16dp" android:text="@string/venueName" android:textStyle="bold" android:textAlignment="viewStart" android:elevation="4dp" android:textSize="14sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/venueInfo"/> <TextView android:id="@+id/venueName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/default_margin" app:layout_constraintStart_toEndOf="@id/venueNameLabel" app:layout_constraintEnd_toEndOf="@id/divider" app:layout_constraintBottom_toBottomOf="@id/venueNameLabel" app:layout_constraintTop_toTopOf="@id/venueNameLabel" tools:text="Madison Square Garden"/> <TextView android:id="@+id/venueAddressLabel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="16dp" android:text="@string/address" android:textStyle="bold" android:textAlignment="viewStart" android:elevation="4dp" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/venueNameLabel"/> <TextView android:id="@+id/venueStateLabel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="16dp" android:text="@string/state" android:textStyle="bold" android:textAlignment="viewStart" android:elevation="4dp" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/venueAddressLabel"/> <TextView android:id="@+id/venueCapacityLabel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="16dp" android:text="@string/venueCapacity" android:textStyle="bold" android:textAlignment="viewStart" android:elevation="4dp" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/venueStateLabel"/> <View android:id="@+id/divider_" android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="@dimen/half_default_margin" android:background="?android:attr/listDivider" app:layout_constraintTop_toBottomOf="@+id/venueCapacityLabel" /> <TextView android:id="@+id/performerHeader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="32dp" android:elevation="4dp" android:text="@string/performers" android:textColor="@android:color/background_dark" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/divider_" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/performersList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="32dp" android:elevation="4dp" android:minHeight="60dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/performerHeader" /> <com.google.android.material.card.MaterialCardView android:id="@+id/imageContainer" android:layout_width="150dp" android:layout_height="210dp" android:layout_marginTop="142dp" android:elevation="12dp" app:cardCornerRadius="4dp" app:cardElevation="4dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" /> </com.google.android.material.card.MaterialCardView> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/share" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/default_margin" android:contentDescription="@string/share" android:scaleX="0.6" android:scaleY="0.6" android:src="@drawable/ic_share_24" app:backgroundTint="@color/colorPrimary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:tint="@android:color/white" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.core.widget.NestedScrollView>
额外提示
- ConstraintLayout中,控件的绘制顺序由XML声明顺序决定,后写的控件视觉层级更高;如果需要手动调整层级,可使用
android:translationZ属性,值越大越靠上。 - 约束设置尽量形成连贯的垂直链条,避免大高度控件的顶部绑定到上方小控件,减少覆盖风险。
内容的提问来源于stack exchange,提问作者Doe
相关产品推荐
相关产品推荐

