Android: Как установить значение R.string из строк. xml в глобальную константу в Kotlin? - PullRequest
1 голос
/ 10 апреля 2020

Я новичок в Kotlin, поэтому, возможно, я упускаю что-то очевидное, но я не смог найти ответ через Google.

Как я могу установить значение константы Kotlin равным Строки. xml Значение ресурса? Я попытался сделать это, как показано ниже, но выдает следующую ошибку:

Причина: java .lang.NullPointerException: Попытка вызвать виртуальный метод 'android .content.res. Ресурсы android .content.Context.getResources () 'для ссылки на пустой объект

Это мой код, первое объявление val завершается неудачно:

class MainActivity: AppCompatActivity() {

        private val STATUS_PREP = getString(R.string.status_prep) //THIS LINE FAILS
        private val STATUS_FIGHT = "fight" //res.getString(R.string.status_fight)
        private val STATUS_REST = "rest" //res.getString(R.string.status_rest)
        private val STATUS_COMPLETE = "complete" //res.getString(R.string.status_complete)
        private val STATUS_PAUSED = "paused" //res.getString(R.string.status_paused)

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Сделайте это вместо этого.

class MainActivity : AppCompatActivity() {

    private STATUS_PREP_2: String by lazy {
        getString(R.string.status_prep_2) 
    }

    private lateint var STATUS_PREP: String

    override fun onCreate(savedInstanceState: Bundle?) {
        // snip
        initString()
    }

    private fun initString() {
        STATUS_PREP = getString(R.string.status_prep) 
        // Init all your string here
    }
}

Вы получаете исключение, потому что context не инициализируется сразу после создания экземпляра действия.

0 голосов
/ 10 апреля 2020

Вы можете создать класс, который наследует класс Application, и создать внутри него поле stati c, в котором будет храниться ссылка на контекст приложения, например:

class MyApplication: Application() {
    companion object {
         var context: Context? = null; private set
    }

     override fun onCreate() {
        super.onCreate()
        context = applicationContext
     }
}

, после чего его имя будет добавлено в AndroidManifest. xml вот так:

<application
    android:name="com.yourpackage.MyApplication"
    ...
    // many other tags>
<application>

И тогда вы можете просто использовать его везде в своем приложении, например:

class MainActivity : AppCompatActivity() {
     private val STATUS_PREP = MyApplication.context!!.getString(R.string.status_prep)
}
...