Kotlin BitmapFactory IllegalStateException

Jos*_*aba 4 android exception bitmap kotlin

我目前正在处理的应用程序加载一个片段并将其呈现到 activity_main.xml ,这工作正常。问题是我实现了一个 RecyclerView 和一个 CardView,以便动态列出我的技能。得到如下错误:

java.lang.IllegalStateException: 
BitmapFactory.decodeResource(ic_launcher_foreground) must not be null
Run Code Online (Sandbox Code Playgroud)

此代码位于加载相应片段的 Kotlin 片段中 ( SkillFragment )

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


}


}
Run Code Online (Sandbox Code Playgroud)

我尝试了几种不同的可绘制资源,但无济于事。也很高兴知道是否有我可以调用的另一种方法可以将 drawable 渲染为 Bitmap

这是我的数据类

package smartline.jjba.storyofmylife
import android.graphics.Bitmap

data class MyData(var text:String, var image: Bitmap)
Run Code Online (Sandbox Code Playgroud)

这是我的适配器代码

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)
        })
    }

}
Run Code Online (Sandbox Code Playgroud)

我在寻找什么

有关如何处理该问题的建议,或该问题是否是 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)
Run Code Online (Sandbox Code Playgroud)

提前感谢这个伟大的社区!!!

更新

感谢@Kiskae,再也没有例外了!在位图中打一个问号,用于 Kotlin 空检查

data class MyData(var text:String, var image: Bitmap?)
Run Code Online (Sandbox Code Playgroud)

但没有加载图像,第一个项目也没有加载??

正在显示的项目的图像

添加到数组的代码图像

Kis*_*kae 5

它不是 Android 或 Kotlin 中的错误,文档BitmapFactory.decodeResource状态如下:

解码后的位图,如果图像数据无法解码,则为 null,或者,如果 opts 为非 null,如果 opts 请求仅返回大小(在 opts.outWidth 和 opts.outHeight 中)

由于您已定义MyData为持有非空 Bitmapkotlin 插入检查以确保返回的位图不为空,这就是发生异常的地方。