#java #android #string #kotlin #arraylist
Вопрос:
Я перевожу приложение в Kotlin, используя два разных файла строк, но в arrayListOf есть строки, подобные этой:
var language = arrayListOf<String>(
"Profile Settings",
"About Us",
"Rate Us",
"Language",
"Push Notification",
"Terms of Service",
"Privacy Policy",
"Help (FAQ)",
"Support"
)
я хочу изменить его, чтобы он реагировал на выбранный язык
, например:
var language = arrayListOf<String>(
"@strings/Profile Settings",
)
можно ли это сделать из arrayListOf? или есть другой способ сделать это?
Ответ №1:
@string
является синтаксисом XML для строкового ресурса. Чтобы получить доступ к строковым ресурсам в Kotlin, вы используете R.string.
R
Значения являются Int, поэтому вам нужно преобразовать их в строки, которые вы можете использовать map
, чтобы избежать необходимости повторять код для каждого элемента.
val language: List<String> = listOf(
R.string.profileSettings,
//...
).map { requireContext().getString(it) }
Если вы делаете это в свойстве, а не в функции, вам нужно обернуть все объявление, by lazy
потому что контекст недоступен до тех пор, пока фрагмент не будет прикреплен.
В действии вы можете опустить requireContext().
, так как само действие является его собственным контекстом, поэтому его можно сократить до .map(::getString)
.
Комментарии:
1. я продолжаю получать эту ошибку «Неожиданные токены (используйте ‘;’ для разделения выражений в одной строке)» после попытки вашего решения
2. У вас, должно быть, проблема с синтаксисом. Может быть, вы использовали неправильные скобки.
Ответ №2:
Вы можете переписать список массивов следующим образом:
var language = arrayListOf<String>(
getString(R.string.profile_settings),
....
)