Flexbox里面不支持Cardview?

问题描述

我想在flexBox布局内创建许多cardview。但是我总是返回NullPointerException。错误控制台说了什么

android.view.InflateException:二进制XML文件第17行:尝试 调用虚拟方法'boolean 空对象引用上的java.lang.String.equals(java.lang.Object)' 原因:java.lang.NullPointerException:尝试在其上调用虚拟方法'boolean java.lang.String.equals(java.lang.Object)' 空对象引用 在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) 在android.view.LayoutInflater.rInflate(LayoutInflater.java:863) 在android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) 在android.view.LayoutInflater.rInflate(LayoutInflater.java:866) 在android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) 在android.view.LayoutInflater.inflate(LayoutInflater.java:515) 在android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在com.tribunnews.app.utils.CommonViewKt.inflate(CommonView.kt:193) 在com.tribunnews.app.itemview.DetailTagsViewHolder.onBind(DetailTagsViewHolder.kt:34) 在com.tribunnews.app.adapter.DetailAdapter.onBindViewHolder(DetailAdapter.kt:118) 在com.tribunnews.app.adapter.DetailAdapter.onBindViewHolder(DetailAdapter.kt:17) 在androidx.recyclerview.widget.RecyclerView $ Adapter.onBindViewHolder(RecyclerView.java:7263) 在androidx.recyclerview.widget.RecyclerView $ Adapter.bindViewHolder(RecyclerView.java:7343) 在androidx.recyclerview.widget.RecyclerView $ Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6204) 在androidx.recyclerview.widget.RecyclerView $ Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6470) 在androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288) 在androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:345) 在androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361) 在androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368) 在androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399) 在android.os.Handler.handleCallback(Handler.java:873) 在android.os.Handler.dispatchMessage(Handler.java:99) 在android.os.Looper.loop(Looper.java:193) 在android.app.ActivityThread.main(ActivityThread.java:6669) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我尝试在布局xml中手动创建仍然返回崩溃,像这样

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <com.google.android.flexBox.FlexBoxLayout
        android:id="@+id/flexBox_parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:layout_marginTop="16dp"
        app:flexWrap="wrap">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="32dp"
            android:layout_margin="4dp"
            android:drawablePadding="2dp"
            android:fontFamily="sans-serif"
            android:gravity="center"
            android:text="Tags"
            android:textColor="?attr/textcolorsecondary"
            android:textSize="14dp"
            android:textStyle="bold"
            app:drawableLeftCompat="@drawable/ic_tag_gray"
            app:drawableTint="@color/colorPrimary"/>


        <androidx.cardview.widget.CardView 
            android:layout_height="40dp"
            android:layout_width="wrap_content"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:layout_margin="4dp"
            app:cardCornerRadius="@dimen/_4dp">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:background="@color/colorSeparatorLight"
                android:orientation="horizontal">

                <view
                    android:id="@+id/color_tags"
                    android:layout_width="3dp"
                    android:layout_height="match_parent"
                    android:background="#ff1000"/>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_gravity="center_vertical"
                    android:layout_marginStart="@dimen/_4dp"
                    android:layout_marginEnd="@dimen/_4dp"
                    android:gravity="center"
                    android:fontFamily="sans-serif"
                    android:text="UU Cipta kerja"
                    android:textColor="@color/colorPrimary"
                    android:textSize="14dp"
                    android:textStyle="bold"
                    android:clickable="true"
                    android:focusable="true"
                    android:id="@+id/tag_text"
                    android:background="@color/colorSeparatorLight"/>
            </LinearLayout>

        </androidx.cardview.widget.CardView>

    </com.google.android.flexBox.FlexBoxLayout>

</LinearLayout>

更新 实际上,我想为cardview创建layoutInflater并将其添加到flexBoxlayout中。这是充气机开始的视点

class DetailTagsViewHolder(private val readActivity: ReadActivity,val site : String?,view: View) : DetailItemViewHolder(view) {

    private val ctx = view.context

    private val lsColor = listof<Int>(R.color.tag_one,R.color.tag_two,R.color.tag_three,R.color.tag_four )

    override fun onBind(data: DetailItemUIModel) {

        (data as? DetailItemUIModel.TagList)?.let {
            val tags = it.list
            itemView.run {

                var tipsC = 0
                tags?.forEachIndexed { index,trendingTag ->
                    if (tipsC > index) {
                        tipsC = 0
                    }
                    val cardTag = ctx.inflate(R.layout.item_card_tag,flexBox_parent) as CardView

                    cardTag?.let {
                        if (!trendingTag.title.isNullOrEmpty()) {
                            val tipColorTag = cardTag.findViewById<View>(R.id.color_tags)
                            tipColorTag.setBackgroundColor(ContextCompat.getColor(context,lsColor[tipsC]))

                            val tagText = cardTag.findViewById<TextView>(R.id.tag_text)
                            tagText.text = trendingTag.title

                            cardTag.setonClickListener {
                                readActivity.gotoPopularactivity(site,trendingTag.alias,site != "tribunnews",Constant.API_TYPE_TAG_QUERY,trendingTag.title)
                            }
                            tipsC++
                        }
                        flexBox_parent.addView(cardTag)
                    }
                }
            }
        }

    }
    override fun onRecycled() {}
}

膨胀的扩展功能

fun Context.inflate(layout: Int,parent: ViewGroup?): View {
    return LayoutInflater.from(this).inflate(layout,parent,false)
}

解决方法

这是view的问题。

在XML文件中用View替换它。

<View
   android:id="@+id/color_tags"
   android:layout_width="3dp"
   android:layout_height="match_parent"
   android:background="#ff1000"/>

view与类属性一起使用以定义customview。像这样

<view
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    class="com.package.YourCustomView" />