首页 > 解决方案 > Flexbox里面不支持cardview?

问题描述

我想在 flexbox 布局中创建许多卡片视图。但我总是返回 NullPointerException。什么错误控制台说

android.view.InflateException:二进制 XML 文件第 17 行:尝试在空对象引用上调用虚拟方法 'boolean java.lang.String.equals(java.lang.Object)' 原因:java.lang.NullPointerException:尝试在 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 的 android.view.LayoutInflater.inflate(LayoutInflater.java:515)。inflate(LayoutInflater.java:423) at com.tribunnews.app.utils.CommonViewKt.inflate(CommonView.kt:193) at com.tribunnews.app.itemview.DetailTagsViewHolder.onBind(DetailTagsViewHolder.kt:34) at com.tribunnews .app.adapter.DetailAdapter.onBindViewHolder(DetailAdapter.kt:118) at com.tribunnews.app.adapter.DetailAdapter.onBindViewHolder(DetailAdapter.kt:17) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java :7263) 在 androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6204) 在 androidx.recyclerview.widget.RecyclerView$ 的 androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7343) 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) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Handler.handleCallback(Handler.java:873) 在 androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal .os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)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(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:858)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(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:858)99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android .internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(Native Method) 在 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)
}

标签: androidxmlmaterial-designandroid-flexboxlayout

解决方案


这是一个问题view

View在 XML 文件中替换它。

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

view与类属性一起使用来定义自定义视图。像这样,

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

推荐阅读