android - FrameLayout$LayoutParams 不能转换为 ConstraintLayout$LayoutParams
问题描述
我的片段中出现以下错误:
java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to androidx.constraintlayout.widget.ConstraintLayout$LayoutParams
我正在使用骨架来隐藏尚未加载的数据,我注意到如果我不使用此骨架布局,则不会出现错误。我不明白为什么,因为我也在其他片段中使用骨架布局并且没有给我任何问题。
这是片段代码:
class EventFragment : Fragment() {
private lateinit var eventBinding: EventBinding
private lateinit var eventViewModel: EventViewModel
private var geocoder: Geocoder? = null
private var eventId: String? = null
private lateinit var eventNameSkeleton: Skeleton
private lateinit var eventCreatorSkeleton: Skeleton
private lateinit var eventPositionSkeleton: Skeleton
private lateinit var eventDateSkeleton: Skeleton
private lateinit var eventDescriptionSkeleton: Skeleton
private lateinit var eventParticipantsSkeleton: Skeleton
private lateinit var eventInterestedSkeleton: Skeleton
private lateinit var eventPictureSkeleton: Skeleton
companion object {
fun newInstance(): EventFragment = EventFragment()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
geocoder = Geocoder(context, Locale.getDefault());
eventBinding = EventBinding.inflate(layoutInflater)
eventViewModel = ViewModelProviders.of(this).get(EventViewModel::class.java)
eventId = this.arguments?.getString("eventId")
return eventBinding.root
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val skeletons: MutableList<Skeleton> = buildSkeletons()
showSkeletons(skeletons)
}
/**
* TODO
*
* @param eventDocument
*/
@RequiresApi(Build.VERSION_CODES.O)
private fun setEventInformation(event: Event) {
eventBinding.eventCreatorName.text = event.creator
eventBinding.eventName.text = event.name
eventBinding.eventDescription.text = event.description
eventBinding.eventDate.text = java.time.format.DateTimeFormatter.ISO_INSTANT
.format(java.time.Instant.ofEpochSecond(event.date!!.seconds))
.toString()
eventBinding.eventPosition.text =
getEventAddress(event.position!!).getAddressLine(0)
Picasso
.get()
.load(event.eventImage)
.fit()
.centerInside()
.into(eventBinding.eventMainPicture)
hideSkeleton(eventPictureSkeleton)
hideSkeleton(eventPositionSkeleton)
hideSkeleton(eventDateSkeleton)
hideSkeleton(eventDescriptionSkeleton)
hideSkeleton(eventCreatorSkeleton)
hideSkeleton(eventNameSkeleton)
}
/**
* Gets the address of an event given a GeoPoint.
*
* @param geopoint, geopoint containing event's position coordinates.
* @return
*/
private fun getEventAddress(geopoint: GeoPoint): Address {
return geocoder!!.getFromLocation(geopoint.latitude, geopoint.longitude, 1)[0]
}
/**
* Builds skeletons layout.
*
* @return a mutable list of Skeleton objects.
*/
private fun buildSkeletons(): MutableList<Skeleton> {
eventNameSkeleton = eventBinding.eventName.createSkeleton(showShimmer = true)
eventCreatorSkeleton = eventBinding.eventCreatorName.createSkeleton(showShimmer = true)
eventDescriptionSkeleton = eventBinding.eventDescription.createSkeleton(showShimmer = true)
eventParticipantsSkeleton = eventBinding.participantsList.createSkeleton(showShimmer = true)
eventInterestedSkeleton = eventBinding.interestedList.createSkeleton(showShimmer = true)
eventPictureSkeleton = eventBinding.eventMainPicture.createSkeleton(showShimmer = true)
eventPositionSkeleton = eventBinding.eventPosition.createSkeleton(showShimmer = true)
eventDateSkeleton = eventBinding.eventDate.createSkeleton(showShimmer = true)
return mutableListOf(
eventNameSkeleton,
eventCreatorSkeleton,
eventDescriptionSkeleton,
eventParticipantsSkeleton,
eventInterestedSkeleton,
eventPictureSkeleton,
eventPositionSkeleton,
eventDateSkeleton
)
}
/**
* Shows a list of Skeleton objects.
*
* @param skeletons, the list of Skeleton objects to show.
*/
private fun showSkeletons(skeletons: List<Skeleton>) {
skeletons.forEach { skeleton ->
skeleton.showSkeleton()
}
}
/**
* Hides a Skeleton object.
*
* @param skeleton, the Skeleton object to hide.
*/
private fun hideSkeleton(skeleton: Skeleton) {
skeleton.showOriginal()
}
}
更新:.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/mainView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:backgroundTint="@android:color/white"
android:orientation="vertical"
tools:context=".fragments.EventFragment">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mainConstraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_conversion_absoluteHeight="994dp"
tools:layout_conversion_absoluteWidth="411dp">
<ImageView
android:id="@+id/eventMainPicture"
android:layout_width="wrap_content"
android:layout_height="200dp"
android:contentDescription="@string/event_image_content_description"
android:scaleType="fitXY"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/event_image_placeholder"
tools:layout_conversion_absoluteHeight="200dp"
tools:layout_conversion_absoluteWidth="411dp" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/eventHeaderWrapper"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eventMainPicture"
tools:layout_conversion_absoluteHeight="67dp"
tools:layout_conversion_absoluteWidth="382dp">
<TextView
android:id="@+id/eventCreatedBy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event_createad_by"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/eventName"
tools:layout_conversion_absoluteHeight="24dp"
tools:layout_conversion_absoluteWidth="83dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="253dp" />
<TextView
android:id="@+id/eventCreatorName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:text="@string/event_creator_placeholder"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/eventCreatedBy"
app:layout_constraintTop_toBottomOf="@+id/eventName"
tools:layout_conversion_absoluteHeight="24dp"
tools:layout_conversion_absoluteWidth="108dp" />
<TextView
android:id="@+id/eventName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event_name_placeholder"
android:textColor="@android:color/black"
android:textColorHighlight="@android:color/black"
android:textColorHint="@android:color/black"
android:textColorLink="@android:color/black"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_conversion_absoluteHeight="38dp"
tools:layout_conversion_absoluteWidth="322dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="210dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/eventInfoWrapper"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eventHeaderWrapper"
tools:layout_conversion_absoluteHeight="63dp"
tools:layout_conversion_absoluteWidth="382dp">
<ImageView
android:id="@+id/eventDateIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/calendar_icon"
tools:layout_conversion_absoluteHeight="24dp"
tools:layout_conversion_absoluteWidth="24dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="292dp" />
<ImageView
android:id="@+id/eventPositionIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eventDateIcon"
app:srcCompat="@drawable/position_icon"
tools:layout_conversion_absoluteHeight="24dp"
tools:layout_conversion_absoluteWidth="24dp" />
<TextView
android:id="@+id/eventDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="@string/event_date"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="@+id/eventDateIcon"
app:layout_constraintStart_toEndOf="@+id/eventDateIcon"
app:layout_constraintTop_toTopOf="parent"
tools:layout_conversion_absoluteHeight="21dp"
tools:layout_conversion_absoluteWidth="202dp" />
<TextView
android:id="@+id/eventPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="10dp"
android:text="@string/event_place"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="@+id/eventPositionIcon"
app:layout_constraintStart_toEndOf="@+id/eventPositionIcon"
app:layout_constraintTop_toBottomOf="@+id/eventDate"
tools:layout_conversion_absoluteHeight="21dp"
tools:layout_conversion_absoluteWidth="135dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/eventDescriptionWrapper"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eventInfoWrapper"
tools:layout_conversion_absoluteHeight="157dp"
tools:layout_conversion_absoluteWidth="382dp">
<TextView
android:id="@+id/eventDescriptionTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event_description_title"
android:textColor="@android:color/black"
android:textColorHighlight="@android:color/black"
android:textColorHint="@android:color/black"
android:textColorLink="@android:color/black"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_conversion_absoluteHeight="27dp"
tools:layout_conversion_absoluteWidth="105dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="370dp" />
<TextView
android:id="@+id/eventDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event_description"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eventDescriptionTitle"
tools:layout_conversion_absoluteHeight="136dp"
tools:layout_conversion_absoluteWidth="382dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="406dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/participantsWrapper"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eventDescriptionWrapper"
tools:layout_conversion_absoluteHeight="227dp"
tools:layout_conversion_absoluteWidth="382dp">
<TextView
android:id="@+id/participantsT"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event_participants"
android:textColor="@android:color/black"
android:textColorHighlight="@android:color/black"
android:textColorHint="@android:color/black"
android:textColorLink="@android:color/black"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_conversion_absoluteHeight="27dp"
tools:layout_conversion_absoluteWidth="111dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="546dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/participantsList"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/participantsT"
tools:layout_conversion_absoluteHeight="190dp"
tools:layout_conversion_absoluteWidth="382dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/interestedWrapper"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/participantsWrapper"
tools:layout_conversion_absoluteHeight="200dp"
tools:layout_conversion_absoluteWidth="382dp">
<TextView
android:id="@+id/interestedTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event_interested_people"
android:textColor="@android:color/black"
android:textColorHighlight="@android:color/black"
android:textColorHint="@android:color/black"
android:textColorLink="@android:color/black"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_conversion_absoluteHeight="27dp"
tools:layout_conversion_absoluteWidth="94dp"
tools:layout_editor_absoluteX="15dp"
tools:layout_editor_absoluteY="794dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/interestedList"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/interestedTitle"
tools:layout_conversion_absoluteHeight="171dp"
tools:layout_conversion_absoluteWidth="380dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
更新2:createSkeleton()
代码
fun View.createSkeleton(
@ColorInt maskColor: Int = ContextCompat.getColor(context, SkeletonLayout.DEFAULT_MASK_COLOR),
cornerRadius: Float = SkeletonLayout.DEFAULT_CORNER_RADIUS,
showShimmer: Boolean = SkeletonLayout.DEFAULT_SHIMMER_SHOW,
@ColorInt shimmerColor: Int = ContextCompat.getColor(context, SkeletonLayout.DEFAULT_SHIMMER_COLOR),
shimmerDurationInMillis: Long = SkeletonLayout.DEFAULT_SHIMMER_DURATION_IN_MILLIS
): Skeleton {
// If this View already has a parent, we need to replace it there with the SkeletonLayout
val parent = (parent as? ViewGroup)
val index = parent?.indexOfChild(this) ?: 0
val params = layoutParams
parent?.removeView(this)
val skeleton = SkeletonLayout(this, maskColor, cornerRadius, showShimmer, shimmerColor, shimmerDurationInMillis)
if (params != null) {
skeleton.layoutParams = params
}
parent?.addView(skeleton, index)
return skeleton
}
解决方案
推荐阅读
- javascript - 在这种情况下,如何在没有 React 的情况下使用 webpack?
- r - 如何在 study_parameters 函数(powerlmm 包)中指定 icc_pre_subject 和 var_ratio?
- javascript - 重命名无限嵌套对象数组中的属性
- neo4j - gremlin 过滤器的 neo4j 密码查询等效项并比较其属性
- jmeter - org.apache.http.NoHttpResponseException: [服务器] 安装卡巴斯基后无法响应错误
- c++ - Destroy() 函数不工作并且一直返回错误,任何想法为什么?
- python - 如何使用 Django 在网页中显示 json 详细信息?
- javascript - 如何让 react-i18next 与 notistack 一起使用?
- javascript - 如何合并在构造函数中作为属性传递的选项对象
- html - 插入时性能是否受到重大影响