Android ресурс: массив строк с ключом / идентификатором? - PullRequest
0 голосов
/ 18 марта 2020

Мне нужно создать Spinner (или раскрывающееся раскрывающееся меню), где пользователь может выбрать продолжительность, в данном случае количество дней. Что-то вроде

one day
two days
three days

Позже я хочу перевести это приложение, поэтому я не могу использовать отображаемый текст в моем коде, например, что-то вроде

if(item.equals("one day"))

не будет работать для других языков чем engli sh.

Итак, я хочу иметь «отображаемое значение» (то, что показано пользователю, например «один день») и технический идентификатор / ключ, что-то вроде «1DAY». Как это можно сделать с Android файлами ресурсов?

Я, наконец, хочу что-то вроде этого:

<!-- give a technical key 1DAY/2DAYS/3DAYS etc to the items -->
<!-- this is just a mockup - how could something like this be really done? -->
<string-array name="duration">
    <item key="1DAY">@string/one_day</item>
    <item key="2DAYS">@string/two_days</item>
    <item key="3DAYS">@string/three_days</item>
    <!-- and so on -->
</string-array>

<!-- these strings could be translated -->
<string name="one_day">one day</string>
<string name="two_days">two days</string>
<string name="three_days">three days</string>

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Другой вариант - использовать тег атрибута. Тег сохранить ключ на вашем представлении, например, вы можете создать перечисление следующим образом:

enum class Days {
  ONE,
  TWO,
  THREE
}

и сопоставить ваш тег:

fun map(days: Days): Int =
    when(days) {
      ONE -> R.string.one
      TWO -> R.string.two
      else -> R.string.x
    }

Итак, данные для передачи представления is:

val exampleDays = Days.ONE
val textId = map(exampleDays)

your_view.text = getString(textId)
your_view.tag = exampleDays

Чтобы восстановить значение, только извлеките тег:

val tag = your_view.tag as Days // cast in Kotlin
if (tag == Days.ONE) 

При таком подходе избегайте дублирования строк и это хороший способ работы с чистой архитектурой.

0 голосов
/ 18 марта 2020

if(item.equals(getResources().getString(R.string.one_day)))

При этом будет получено правильное строковое значение с правильного языка.

См. этот пост для справки.

...