FrameLayout $ LayoutParams не может быть приведен к ConstraintLayout $ LayoutParams - PullRequest
0 голосов
/ 10 февраля 2020

Я получаю следующую ошибку в своем фрагменте:

java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to androidx.constraintlayout.widget.ConstraintLayout$LayoutParams

Я использую Скелет, чтобы скрыть данные, когда они еще не загружены, и я замечаю, что если я не использую этот Скелет макет, ошибка не появляется. Я не понимаю почему, потому что я использую макет Skeleton и в других фрагментах и ​​не доставляет мне никаких проблем.

Это фрагмент кода:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...