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