使用自定义视图会导致视图膨胀异常

时间:2021-07-05 21:46:00

标签: android kotlin view inflate-exception

我使用圆形图像制作了自定义视图,圆形图像使用可塑形图像视图和框架布局围绕显示可绘制圆形背景和文本视图。这在牛轧糖及以上版本中运行良好。但应用程序在棉花糖及以下版本中崩溃。

google mdc shapeable ImageView 是否导致问题?

我的自定义视图布局

<?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"
    android:layout_width="wrap_content"
    android:id="@+id/cl_root"
    android:layout_height="wrap_content">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_profile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0">

        <FrameLayout
            android:id="@+id/fl_user_level"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:background="@drawable/red_round"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <com.google.android.material.imageview.ShapeableImageView
            android:id="@+id/iv_user_image"
            android:layout_width="47dp"
            android:layout_height="47dp"
            android:background="@color/dark_grey"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@+id/fl_user_level"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.RoundImageStyle" />

        <TextView
            android:id="@+id/tv_user_name_letter"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/biennale_semi_bold"
            android:text="K"
            android:visibility="gone"
            android:textColor="@color/black"
            android:textSize="14sp"
            app:layout_constraintBottom_toBottomOf="@+id/iv_user_image"
            app:layout_constraintEnd_toEndOf="@+id/iv_user_image"
            app:layout_constraintStart_toStartOf="@+id/iv_user_image"
            app:layout_constraintTop_toTopOf="@+id/iv_user_image" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    <TextView
        android:id="@+id/tv_user_name_"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/biennale_regular"
        android:text="Puma"
        android:textColor="@color/black"
        android:textSize="12sp"
        android:layout_marginTop="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/cl_profile" />

</androidx.constraintlayout.widget.ConstraintLayout>

自定义视图类

class LevelProfileImageView(context: Context, attrs: AttributeSet) :
    ConstraintLayout(context, attrs) {

    init {
        inflate(context, R.layout.layout_item_recent_payment, this)
    }

    enum class UserProfileLevel{
        RED,GREEN,YELLOW,NONE
    }

    fun setLevel(level : UserProfileLevel){
        when(level){
            UserProfileLevel.RED->{
                fl_user_level.setBackgroundResource(R.drawable.red_round)
            }
            UserProfileLevel.GREEN->{
                fl_user_level.setBackgroundResource(R.drawable.green_round)
            }
            UserProfileLevel.YELLOW->{
                fl_user_level.setBackgroundResource((R.drawable.yellow_round))
            }
            UserProfileLevel.NONE->{
                fl_user_level.makeInvisible()
            }
        }
    }

    fun setProfileImage(imageUrl:String?){
        if(!imageUrl.isNullOrEmpty()){
            iv_user_image.loadImageWithUrl(imageUrl,onError = {
                when(it){
                    //set bg to imageview
                }
            })
        }else{
            //set bg to imageview
        }
    }
    fun setProfileImage(resId:Int?){
        if(!resId.isNull()){
            iv_user_image.loadImageWithResId(resId)
            tv_user_name_letter.hide()
        }else{
            iv_user_image.setBackgroundColor(ContextCompat.getColor(context,R.color.app_sky_blue))
        }
    }

    fun setProfileName(name:String){
        tv_user_name_.text =name
    }

    fun setFirstLetter(name:String){
        tv_user_name_letter.text = name.first().toString().toUpperCase(Locale.getDefault())
        tv_user_name_letter.show()


    }
}

在列表项中的使用

<com.ex.customerapp.utils.LevelProfileImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:id="@+id/level_image"
    android:layout_height="wrap_content"
    android:layout_marginTop="12dp">

</com.ex.customerapp.utils.LevelProfileImageView>

崩溃日志

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ex.excustomer, PID: 4487
    android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class com.ex.customerapp.utils.LevelProfileImageView
        at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at com.ex.customerapp.ui.home.adapter.RecentTransactionsAdapter.onCreateViewHolder(RecentTransactionsAdapter.kt:18)
        at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7295)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6416)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)
        at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:572)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
        at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3686)
        at android.view.View.measure(View.java:18788)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:583)
        at androidx.constraintlayout.solver.widgets.analyzer.Direct.horizontalSolvingPass(Direct.java:234)
        at androidx.constraintlayout.solver.widgets.analyzer.Direct.solveHorizontalMatchConstraint(Direct.java:596)
        at androidx.constraintlayout.solver.widgets.analyzer.Direct.horizontalSolvingPass(Direct.java:286)
        at androidx.constraintlayout.solver.widgets.analyzer.Direct.solvingPass(Direct.java:118)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.layout(ConstraintWidgetContainer.java:642)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solveLinearSystem(BasicMeasure.java:159)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:290)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
        at android.view.View.measure(View.java:18788)
        at androidx.core.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1599)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.core.widget.NestedScrollView.onMeasure(NestedScrollView.java:585)
        at android.view.View.measure(View.java:18788)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat

用于创建 ViewHolder

 return when(viewType){
            TYPE_USER ->{
                RecentTransactionsViewHolder(
                    LayoutInflater.from(parent.context).inflate(R.layout.item_recent_payment, parent, false)
                )
            }

0 个答案:

没有答案