Kotlin: getResources () для пустой ссылки на объект - PullRequest
1 голос
/ 08 марта 2019

У меня есть массив цветов, как это в 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 (this, R.color.text_yellow) это нормально, без сбоев, но через индекс массива выдает ошибку

Ответы [ 2 ]

5 голосов
/ 08 марта 2019

Вы объявляете это как поле:

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().И когда вы объявляете что-то как поле, оно пытается немедленно инициализировать это перед вызовом любого метода.(То есть до вызова 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 голосов
/ 08 марта 2019

Вы используете 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])
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...