问题描述
我想在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" />