android - Kotlin 位图工厂 IllegalStateException

标签 android exception bitmap kotlin

我目前正在开发的应用程序加载了一个 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?)

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

image of items being displayed

image of code adding to array

最佳答案

这不是 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/

相关文章:

android - 为什么我会收到 WIN DEATH : Window{45087aa8 com. gigabites.fortune/com.gigabites.fortune.BuildActivity paused=false} 错误?

android - 从 InputStream 调整位图大小

java - 如何设置 ImageView 以显示图像 url 中的图像?

android - 如何验证应用程序用户登录用户名和密码

android - 如何将数据绑定(bind)变量作为 xml 属性传递给自定义 View

c# - 我应该如何处理此 C# 函数中的异常?

java - 不允许异常链接的 JDK 异常怎么了?

java - RunTimeException 无法在 catch block 中处理

android - RecyclerView 对齐居中后如何获取居中项?

Android - 跟踪线程