Kotlin:null对象引用的getResources()

问题描述 投票:1回答:2

我在kotlin中创建了这样的颜色数组

private var colorArray = arrayOf(
    ContextCompat.getColor(this, R.color.text_yellow),
    ContextCompat.getColor(this, R.color.text_green),
    ContextCompat.getColor(this, R.color.text_red)
)

当我想从colorArray通过索引获取颜色

var color = colorArray[0]

我在索引0上遇到崩溃,

尝试在空对象引用上调用虚方法'android.content.res.Resources android.content.Context.getResources()'

我不知道我错在哪里如果我写ContextCompat.getColor(这,R.color.text_yellow)这很好没有崩溃但是通过数组索引它给我错误

android arrays kotlin android-context
2个回答
5
投票

您将此声明为字段:

private var colorArray = arrayOf(
    ContextCompat.getColor(this, R.color.text_yellow),
    ContextCompat.getColor(this, R.color.text_green),
    ContextCompat.getColor(this, R.color.text_red)
)

问题是在调用this方法之前,您的上下文(onCreate()参数)为null。当你将某些东西声明为一个字段时,它会尝试在任何方法调用之前立即初始化它。 (所以在调用onCreate之前)

您可以做的是使用lazy调用初始化此字段。这意味着它实际上只在首次使用时初始化。因此,如果您在onCreate之后调用索引,则上下文不会为空,它应该可以正常工作。

将其更改为:

private var colorArray by lazy { arrayOf(
    ContextCompat.getColor(this, R.color.text_yellow),
    ContextCompat.getColor(this, R.color.text_green),
    ContextCompat.getColor(this, R.color.text_red)
) }

0
投票

您正在全球范围内使用this作为Context,但尚未初始化。这就是为什么你得到这个错误导致Context为空。

引起:java.lang.NullPointerException:尝试调用虚方法'android.content.res.Resources android.content.Context.getResources()

正确的方法是访问onCreate()中的上下文。您可以尝试以下内容: -

class Dx :AppCompatActivity(){
private lateinit var colorArray:Array<Int>
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_dx)
    colorArray = arrayOf(
            ContextCompat.getColor(this, R.color.colorAccent),
            ContextCompat.getColor(this, R.color.colorPrimary),
            ContextCompat.getColor(this, R.color.colorPrimaryDark)
    )
    val btn=findViewById<Button>(R.id.b1)
    btn.setBackgroundColor(colorArray[0])
}
}
© www.soinside.com 2019 - 2024. All rights reserved.