我在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)这很好没有崩溃但是通过数组索引它给我错误
您将此声明为字段:
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)
) }
您正在全球范围内使用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])
}
}