Как присвоить строковый ресурс значению kotlin без получения ошибки - PullRequest
0 голосов
/ 21 июня 2019

У меня есть значение внутри моего кода:

val mainFileName = "Untitled list"

Как я знаю, лучший способ обработки строк - использование строкового ресурса, поэтому внутри файла ресурсов String я создал эту строку:

<string name="untitled_list">Untitled list</string>

Чтобы проверить, все ли я сделал правильно, я проверил эту строку на тосте, и все работает нормально:

Toast.makeText(this, R.string.untitled_list,Toast.LENGTH_SHORT).show()

Затем я попытался присвоить "mainFileName" эту строкусделать ресурс (внутри класса MainActivity, но вне метода OnCreate):

val previewOfNewListTitle = resources.getString(R.string.untitled_list)

но я получаю ошибку:

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:91)
    at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
    at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:543)
    at lt.tetro.myapplication.MainActivity.<init>(MainActivity.kt:121)

Как я могу назначить текст строкового ресурса для "mainFileName"внутри класса MainActivity?

Ответы [ 3 ]

2 голосов
/ 22 июня 2019

resources нужен действительный Context (хотя вы можете опустить его в классе активности), например:

this.resources

, который не существует до завершения super.onCreate().Поэтому любая попытка использовать его раньше приведет к ошибке.Что вы можете сделать, это объявить переменную с помощью функции lazy следующим образом:

val previewOfNewListTitle: String by lazy { resources.getString(R.string.untitled_list) }

Это допустимо, потому что она не инициализирует переменную до тех пор, пока вы не используете ее в первый раз.в вашем коде.

2 голосов
/ 22 июня 2019

Затем я попытался присвоить «mainFileName» этот строковый ресурс, выполнив это (внутри класса MainActivity, но вне метода OnCreate):

Вам нужно подождать до super.onCreate()перед попыткой использовать большинство методов, которые вы унаследовали от Activity, включая getString().

Как я могу назначить текст строкового ресурса для "mainFileName" внутри класса MainActivity?

Использование lateinit var:

class SomethingActivity : AppCompatActivity() {
  private lateinit var mainFileName: String

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    mainFileName = getString(R.string.untitled_list)

    // TODO rest of your activity here
  }
}
0 голосов
/ 22 июня 2019

resources () - это метод класса Context. Если вы находитесь внутри Activity или Service (которые расширяют Context), вы можете использовать их как в этом фрагменте.

Также обратите внимание , что вся языковая зависимость может быть учтена платформой Android. Просто создайте разные папки для каждого языка. Если английский является вашим языком по умолчанию, просто поместите английские строки в res / values ​​/ strings.xml. Затем создайте новую папку values-ru и поместите русские строки с одинаковыми именами в res / values-ru / strings.xml. С этого момента Android выбирает правильный в зависимости от локали устройства для вас, когда вы вызываете getString () или когда ссылаетесь на строки в XML через @ string / mystring. Файлы из res / values ​​/ strings.xml являются запасными, если у вас нет папки, охватывающей языковой стандарт пользователей, эта будет использоваться в качестве значений по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...