我目前正在开发的应用程序加载了一个 fragment 并将其呈现给 activity_main.xml ,效果很好。问题是我实现了 RecyclerView 和 CardView,以便动态列出我的技能。出现如下错误:
java.lang.IllegalStateException:
BitmapFactory.decodeResource(ic_launcher_foreground) must not be null
此代码位于加载相应 fragment (SkillFragment) 的 Kotlin fragment 中
package smartline.jjba.storyofmylife
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import smartline.jjba.storyofmylife.R.id.rv
import androidx.recyclerview.widget.LinearLayoutManager
class SkillFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(R.layout.fragment_skills, container, false)
companion object {
fun newInstance(): SkillFragment = SkillFragment()
}
fun addItemsToCard(items: ArrayList<MyData>) {
items.run {
add(MyData("text 1", BitmapFactory.decodeResource(resources, R.drawable.ic_launcher_foreground)))
add(MyData("text 2", BitmapFactory.decodeResource(resources, R.drawable.ic_baseline_bar_chart_24px)))
add(MyData("text 3", BitmapFactory.decodeResource(resources, R.drawable.ic_baseline_bar_chart_24px)))
add(MyData("text 4", BitmapFactory.decodeResource(resources, R.drawable.ic_baseline_bar_chart_24px)))
add(MyData("text 5", BitmapFactory.decodeResource(resources, R.drawable.ic_baseline_bar_chart_24px)))
add(MyData("text 6", BitmapFactory.decodeResource(resources, R.drawable.ic_baseline_bar_chart_24px)))
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val _recyclerView: RecyclerView = view.findViewById(R.id.rv)
_recyclerView.layoutManager = LinearLayoutManager(this.context, LinearLayout.VERTICAL, false)
var itemList = ArrayList<MyData>()
addItemsToCard(itemList)
//creating our adapter
val adapter = RecyclerViewAdapter(itemList)
//now adding the adapter to recyclerview
_recyclerView.adapter = adapter
}
}
我尝试了几种不同的可绘制资源,但都无济于事。也很高兴知道是否有另一种我可以调用的方法将可绘制对象渲染成位图
这是我的数据类
package smartline.jjba.storyofmylife
import android.graphics.Bitmap
data class MyData(var text:String, var image: Bitmap)
这是我的适配器代码
class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
fun bindItems(data : MyData){
val _textView:TextView = itemView.findViewById(R.id.textview)
val _imageView:ImageView = itemView.findViewById(R.id.imageview)
_textView.text = data.text
_imageView.setImageBitmap(data.image)
//set the onclick listener for the singlt list item
itemView.setOnClickListener({
Log.e("ItemClicked", data.text)
})
}
}
我在找什么
关于如何处理该问题的建议,或者它是否是 Android 或 Kotlin 中的已知错误的信息。我可能可以在设备上重新安装 Android Studio,它会再次正常,但我不希望这种情况发生,如果我能阻止的话。
这是异常日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: smartline.jjba.storyofmylife, PID: 21687
java.lang.IllegalStateException: BitmapFactory.decodeReso…e.ic_launcher_foreground) must not be null
at smartline.jjba.storyofmylife.SkillFragment.addItemsToCard(SkillFragment.kt:28)
at smartline.jjba.storyofmylife.SkillFragment.onViewCreated(SkillFragment.kt:44)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
提前感谢这个伟大的社区!!!
更新
感谢@Kiskae,再也没有异常(exception)了! 在 Bitmap 中打一个问号,用于 Kotlin 空检查
data class MyData(var text:String, var image: Bitmap?)
但是没有加载图像,第一个项目也没有加载??
最佳答案
这不是 Android 或 Kotlin 中的错误,BitmapFactory.decodeResource
的文档指出:
The decoded bitmap, or null if the image data could not be decoded, or, if opts is non-null, if opts requested only the size be returned (in opts.outWidth and opts.outHeight)
因为您已经定义了 MyData
来保存一个非空 Bitmap
kotlin 插入一个检查以确保返回的位图不为空,这是发生异常的地方。
关于android - Kotlin 位图工厂 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51311154/