Статьи

Основы Android: работа со строками и массивами строк

Одна плохая практика кодирования, которая действительно вскипает в нашей крови, — это когда разработчики включают необработанный строковый контент, встроенный в код. Конечно, иногда есть веские причины для этого, особенно при написании кода отладки, но, вообще говоря, если ваше приложение Android использует строковый контент, отображаемый на экране, эти данные принадлежат ресурсам Android, а не самому коду.

Включение строкового содержимого в качестве ресурса дает ряд преимуществ, таких как:

  • Он централизует строки, используемые приложением, в одном месте, которым легко управлять (разработчик или не разработчик).
  • Строки могут быть определены как ресурс один раз и использоваться во всем коде. Следовательно, оно будет иметь последовательное написание, регистр и пунктуацию.
  • Строки можно легко интернационализировать, что позволяет вашему приложению поддерживать несколько языков с помощью одного файла пакета приложения (APK).
  • Строки не загромождают код приложения, делая его понятным и простым в обслуживании.

Итак, давайте поговорим о том, как эффективно добавлять строки и, что более важно, ресурсы массива строк в ваши приложения.

Строковые ресурсы находятся в файле /res/values/strings.xml. Определите запись строкового ресурса для каждой строки, используемой вашим приложением. Назовите свои строковые ресурсы соответствующим образом. Например, следующий отрывок XML определяет количество типов расы игровых персонажей в виде отдельных строк:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?xml version=»1.0″ encoding=»utf-8″?>
<resources>
    <string
        name=»app_name»>Choose Your Own</string>
    <string
        name=»race_orc»>Orc</string>
    <string
        name=»race_elf»>Elf</string>
    <string
        name=»race_troll»>Troll</string>
    <string
        name=»race_human»>Human</string>
    <string
        name=»race_halfling»>Halfling</string>
    <string
        name=»race_goblin»>Goblin</string>
</resources>

Обратите внимание на префикс «race_» каждого строкового ресурса. Это помогает напомнить членам команды, что эти строки могут быть как-то связаны. Например, они могут использоваться вместе с массивом или отображаться как параметры в элементе управления Spinner.

Вы можете легко загрузить строку для использования в своем коде, используя метод getString () класса Resources. Следующий код может быть добавлен в ваш класс Activity для загрузки ресурса String, определенного в вашем приложении:

1
String sOrc = getResources().getString(R.string.race_orc);

Удобная вещь о загрузке ресурсов таким способом состоит в том, что если вы предоставили альтернативные ресурсы на разных языках, соответствующая языковая версия строки будет загружена на основе настроек устройства во время выполнения. Никакого специального кода не требуется, чтобы это работало.

Теперь предположим, что вы хотите создать массив из этих строк. Конечно, вы можете загрузить их все по отдельности в коде Java и создать массив String в памяти, но вам нужно будет знать каждое из полных имен идентификатора ресурса и ссылаться на него в коде. Вместо этого лучше всего создать ресурс строкового массива, который ссылается на уже созданные вами отдельные строковые ресурсы, связывая их вместе.

Ресурсы строкового массива лучше всего хранить в файле /res/values/arrays.xml. Определите строковый массив с элементом для каждой строки, используемой вашим приложением. Назовите ресурсы вашего строкового массива соответствующим образом. Например, следующий отрывок XML определяет массив, который содержит каждый из типов расы игровых персонажей, определенных в файле ресурсов strings.xml на шаге 1:

01
02
03
04
05
06
07
08
09
10
11
12
<?xml version=»1.0″ encoding=»utf-8″?>
<resources>
    <string-array
        name=»races_array»>
        <item>@string/race_goblin</item>
        <item>@string/race_orc</item>
        <item>@string/race_elf</item>
        <item>@string/race_human</item>
        <item>@string/race_troll</item>
        <item>@string/race_halfling</item>
    </string-array>
</resources>

Вы можете легко загрузить массив строк для использования в своем коде, используя метод getStringArray () класса Resources. Следующий код может быть добавлен в ваш класс Activity для загрузки ресурса массива, определенного в вашем приложении:

1
String[] cRaces = getResources().getStringArray(R.array.races_array);

Одна из полезных причин для выполнения всей этой работы — заполнение элемента управления, для которого требуется адаптер данных, самый простой из которых — массив. Если вы не знакомы с использованием адаптеров данных для заполнения элементов управления Spinner и т. П., Ознакомьтесь с руководством Hello Spinner на веб-сайте Android Developer . Однако метод, описанный в связанном учебном пособии, не так легко интернационализировать, как тот, который мы описываем в этом кратком руководстве, так как он определяет необработанное содержимое строки в ресурсе строкового массива, а не как строковые ссылки.

Использование ресурсов строкового массива позволяет пропустить шаги подключения адаптера данных к вашему элементу управления. Например, простой элемент управления Spinner или раскрывающийся список можно заполнить ресурсом строкового массива, не беспокоясь об изнурительных адаптерах. Вы просто добавляете элемент управления Spinner в свой файл макета и устанавливаете его атрибут android: records для созданного вами массива строк, и все готово. Например:

1
2
3
4
5
6
<Spinner
     android:layout_height=»wrap_content»
     android:layout_width=»match_parent»
     android:id=»@+id/spinnerOfCharacterRaces»
     android:entries=»@array/races_array»>
</Spinner>

Это определяет элемент управления Spinner, который будет показывать каждую из строк расы персонажа в качестве параметров, как показано на рисунке 1.

Снимок экрана счетчика, использующего массив строк ресурса для его заполнения

В вашем классе Activity теперь вы можете реализовать OnItemSelectedListener для захвата, когда пользователь выбирает определенную расу символов, например так:

1
2
3
4
5
6
7
Spinner cRaceSpinner = (Spinner) findViewById(R.id.spinnerOfCharacterRaces);
cRaceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
   public void onItemSelected(AdapterView<?> arg0, View arg1,arg2, long arg3) {
      String strChosenRace = (String) arg0.getItemAtPosition(arg2);
   }
   public void onNothingSelected(AdapterView<?> arg0) {}
});

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

Нет абсолютно никакой причины определять строки и массивы строк, встроенных в код. Строки и массивы строк принадлежат вашим ресурсам приложений Android, не загромождая вашу элегантную Java. Хранение строковых данных в файлах ресурсов дает ряд преимуществ, включая лучшую организацию и упрощение интернационализации. Строковые массивы являются еще более мощными, когда они состоят из ссылок на строковые ресурсы вместо необработанных строковых данных. Ресурсы строкового массива можно приклеить ко многим элементам управления пользовательского интерфейса, которые, как правило, полагаются на адаптеры данных без особых хлопот, что делает ваш код еще более читаемым и обслуживаемым.

Как всегда, мы с нетерпением ждем ваших отзывов.

Разработчики мобильных приложений Лорен Дарси и Шейн Кондер являются соавторами нескольких книг по разработке Android: углубленная книга по программированию под названием « Разработка беспроводных приложений для Android, второе издание» и « Самс научи себя разработке приложений для Android за 24 часа, второе издание» . Когда они не пишут, они тратят свое время на разработку мобильного программного обеспечения в своей компании и оказание консультационных услуг. С ними можно связаться по электронной почте [email protected] , через их блог на androidbook.blogspot.com и в Twitter @androidwireless .