- Android Essentials: Working with Strings and String Arrays
- Step 1: Define String Resources for Individual Strings
- Step 2: Load Your String Resources Programmatically
- Step 3: Define String Array Resources Using String Resource References
- Step 4: Load Your String Array Resources Programmatically
- Step 5: Referencing Array Resources in Simple Spinner Controls
- Conclusion
- Android string.xml — несколько вещей, которые стоит помнить
- Не используйте повторно
- Разделяйте
- Форматирование
- Множественное число
- Подстветка слов
- Android Ресурсы . Работа со строками, цветами, стилями, картинками
- Ресурсы
- Ресурсы из папки res/values
- Файл string.xml. Локализация
- Доступ к ресурсам из XML
- Доступ к ресурсам из Java кода
- Зачем работать с ресурс файлами из Java кода, если можно из XML?
- Файл colors.xml
- Файл styles.xml. Стили
- Наследование стилей
- Наследование с помощью слова parent
- Наследование с помощью символа . (точка)
- Переопределение атрибутов родительского стиля
- Папка drawable. Работа с картинками
- Доступ к картинке из XML кода
- Доступ к картинке из Java кода
- Заключение
Android Essentials: Working with Strings and String Arrays
One poor coding practice that really gets our blood boiling is when developers include raw string content inline in code. Sure, there are occasionally good reasons to do this, especially when writing debug code, but generally speaking, if your Android application relies on string content that is displayed on the screen, this data belongs in the Android resources, not in the code itself.
There are a number of benefits to including string content as a resource, such as:
- It centralizes the strings used by the application in a single location that is easily managed (by the developer or a non-developer).
- Strings can be defined as a resource once, and used throughout the code. Therefore, it will have consistent spelling, case and punctuation.
- Strings can be internationalized easily, allowing your application to support multiple languages with a single application package file (APK).
- Strings don’t clutter up your application code, leaving it clear and easy to maintain.
So let’s talk about how to add strings and more importantly, string array resources to your applications effectively.
Step 1: Define String Resources for Individual Strings
String resources belong in the /res/values/strings.xml file. Define a string resource entry for each string used by your application. Name your string resources appropriately. For example, the following XML excerpt defines a number of game character race types as individual strings:
Note the “race_” prefix of each string resource. This helps remind team members that these strings may be related somehow. For example, they might be used together an array or displayed as options in a Spinner control.
Step 2: Load Your String Resources Programmatically
You can easily load a string to use in your code using the getString() method of the Resources class. The following code can be dropped into your Activity class to load a String resource defined in your application:
The handy thing about loading resources this way is that if you’ve provided alternative resources in different languages, the appropriate language version of the string will be loaded based upon the device settings at runtime. No special code is needed for this to work.
Step 3: Define String Array Resources Using String Resource References
Now let’s say you wanted to create an array of those character race strings. Sure, you could load them all up individually in the Java code and make a String array in memory, but you would need to know each of the resource’s full id names and reference it in the code. Instead, your best bet is to create a string array resource that references the individual string resources you’ve already created, tying them together.
String array resources are best stored in the /res/values/arrays.xml file. Define a string array with an item for each string used by your application. Name your string array resources appropriately. For example, the following XML excerpt defines an array that contains each of the game character race types defined in the strings.xml resource file in Step 1:
Step 4: Load Your String Array Resources Programmatically
You can easily load a string array to use in your code using the getStringArray() method of the Resources class. The following code can be dropped into your Activity class to load an array resource defined in your application:
Step 5: Referencing Array Resources in Simple Spinner Controls
One useful reason to go through all this work is to populate a control that requires a data adapter, the simplest of which is an array. If you are unfamiliar with using data adapters to populate Spinner controls and the like, check out the Android Developer website’s Hello Spinner tutorial. However, the method described in the linked tutorial is not as easily internationalized as what we are describing in this quick tut, since it defines the raw string contents in the string array resource, instead of as string references.
Using string array resources allows you to skip the steps of hooking up your data adapter to your control. For example, a simple Spinner control, or dropdown, can be populated with a string array resource without bothering with pesky adapters. You simply add a Spinner control to your layout file and set its android:entries attribute to the string array you created and you’re done. For example:
This defines a Spinner control that will show each of the character race strings as options, as shown in Figure 1.
In your Activity class, you can now implement an OnItemSelectedListener to capture when the user selects a specific character race, like this:
Here we simply react whenever an item in the Spinner is selected. We look up the data selected using the getItemAtPosition() method, which, in the case of a string array resource, is the string data itself.
Conclusion
There’s absolutely no reason to define strings and arrays of strings inline in code. Strings and string arrays belong in your Android application resources, not cluttering up your elegant Java. There are a number of benefits to storing string data in resource files, including better organization and easier internationalization. String arrays are even more powerful when they are comprised of string resource references instead of the raw string data. String array resources can be glued to many UI controls that generally rely upon data adapters without a lot of fuss, making your code even more readable and maintainable.
As always, we look forward to your feedback.
Источник
Android string.xml — несколько вещей, которые стоит помнить
Доброго времени суток! Представляю вашему вниманию вольный перевод статьи от GDE (Google developer expert) Dmytro Danylyk. Собственно, вот оригинал. Статья описывает правильные подходы для работы со strings.xml и особенно полезно это будет разработчикам, которые разрабатывают мультиязыковые приложения. Прошу под кат.
Эта статья о такой тривиальной вещи android как string.xml.
Не используйте повторно
Не используйте повторно строки для разных экранов
Давайте представим, что у вас есть loading dialog на Sign In либо Sign Up экране. Так как оба экрана имеют loading dialog, вы решаете использовать те же строки — R.string.loading.
Позже, если вы решите использовать различные, вам нужно будет создать 2 разные строки и модифицировать их, непосредственно, в .java классах. Если вы используете разные строки с начала — вам бы пришлось модифицировать лишь strings.xml файл.
Вы никогда не будете заранее знать поддержку и перевод какого языка вам предстоит добавить. Всё дело в контексте: в одном языке вы можете использовать тоже слово в одном контексте, но в другом — это слово по смыслу не будет подходить.
Обратите внимание, что в данном случае английская версия strings.xml использует тоже самое слово — “Yes” для обоих случаев R.string.download_file_yes и R.string.terms_of_use_yes strings.
Но украинский вариант strings.xml использует 2 разных слова — “Гаразд” для R.string.download_file_yes и “Так” для R.string.terms_of_use_yes.
Разделяйте
Разделяйте строки, которые относятся к одному экрану с помощью префиксов и комментариев
- Добавляйте префикс в виде имени экрана к каждой строке для более простого понимания к какому экрану относится данный ресурс.
- Чистый string.xml файл поможет достаточно легко поддерживать и переводить различные языки — экран за экраном.
Создание различных strings.xml для каждого экрана
Если вы хотите, вы можете создать string.xml файл для каждого экрана — settings-strings.xml, profile-strings.xml. Но обычно приложение имеет около 10-20 экранов, соответственно, нужно иметь 10-20 string.xml файлов в каждой языковой папке. Я думаю, что это будет сопряжено с беспорядком.
Форматирование
Используйте Resources#getString(int id, Object… formatArgs) для форматирования строк
Никогда не делайте конкатенацию через + оператор, поскольку в других языках порядок слов может варьироваться.
Множественное число
Используйте Resources#getQuantityString(int id, int quantity) для количественных строк
Не решайте проблемы с множественным числом в java коде, поскольку разные языки имеют разные правила для согласования множественного числа
Подстветка слов
Используйте html text для подсветки статический слов
Источник
Android Ресурсы . Работа со строками, цветами, стилями, картинками
Ресурсы
В Android системе почти всё, что не является Java кодом, является ресурсами. Ресурсы используются для определения цветов, изображений, макетов, строковых значений и т.д. Вы можете указывать значения в файлах ресурсов, а потом ссылаться на них в Java коде вашего приложения.
Все ресурсы находятся в папке res . Посмотрим, какие по умолчанию есть папки, файлы в каталоге res .
- drawable – хранит в себе картинки, другие графические файлы.
- layout – хранит все макеты приложения.
- mipmap – хранит лого приложения, которое отображается в меню приложений.
- values – хранит в себе разные ресурсы, такие как цвета, строки, стили, размеры.
Далее нам необходимо в верхнем левом углу поменять отображение проекта с Android на Project . Это позволит нам увидеть все папки, которые реально созданы в нашем проекте. Изначально мы не делали этого, чтобы не пугать вас 🙂
Можете заметить, что на самом деле в проекте несколько папок drawable и mipmap . Это папки для разных разрешений экранов, устройств, версий системы. Подробнее это обсудим в следующих уроках.
Ресурсы из папки res/values
Нажмём на папку values , посмотрим, что в ней находится:
- colors.xml – содержит в себе все цвета.
- strings.xml – хранит все строковые ресурсы.
- styles.xml – хранит стили приложения.
Хранение таких данных в отдельных ресурсах дает нам гибкость и удобство при работе с проектом. Мы рассмотрим преимущества использования ресурсов на примере локализации – поддержки нескольких языков в приложении.
Файл string.xml. Локализация
Мы будем поддерживать два языка в нашем приложении: английский и русский. Для локализации приложения используют файл strings.xml . Туда помещается весь текст приложения, который должен быть подвержен локализации. Чтобы добавить поддержку ещё одного языка, надо создать папку с именем values-language . Т.к. мы поддерживаем русский язык, то создадим папку values-ru . Для этого нажмём правой кнопкой на папку res и выберем пункт New -> Android resource directory :
- Directory name – values-ru
- Resource type – values
- Source set – main
Вот как это должно выглядеть:
После этого видим, что создалась папка values-ru . Отлично, создадим новый файл strings.xml . Для этого нажимаем правой кнопкой по папке values-ru , выбираем New -> Values resource file :
Затем появится окно, в котором необходимо ввести имя файла. Вводим strings . Теперь всё, что нам надо сделать – это добавлять ресурсы в эту папку с таким же именем, но значения мы будем писать на русском языке. Система автоматически будет брать значения из этого файла, если у пользователя на устройстве установлен русский язык. Для начала давайте посмотрим как выглядит обычный строковый ресурс:
У каждого строкового ресурса есть имя, по которому в дальнейшем будет идти обращение к нему, а также его значение. На самом деле так выглядят не только строковые ресурсы, а все ресурсы приложения:
Просто вместо типа ресурса string используются другие необходимые значения ( color , dimen и т.д.). Теперь проверим, что это всё действительно работает. В файле values/strings.xml по умолчанию при создании проекта есть строка app_name :
Теперь добавим эту же строку, но на русском языке в файл values-ru/strings.xml :
Видим, что название ресурса app_name совпадает в двух папках. А вот значения мы можем указывать для каждого языка свои.
Доступ к ресурсам из XML
Теперь после создания строкового ресурса нам необходимо использовать его в layout файле. Ссылка на наш ресурс будет выглядеть так: @string/app_name . Но сейчас остановимся на минуту и разберём общий синтаксис при ссылке на файл ресурса из XML:
- – имя пакета, в котором находится ресурс. Чаще всего его не будет, т.к. мы берём ресурсы из своего приложения. Если бы мы хотели взять строку из android библиотеки, то обращались бы @android:string .
- – тип ресурса, к которому мы обращаемся. В данном случае – string . Обратите внимание, что название отличается от названия файла strings – используется единственное число.
- – название ресурса.
Теперь, когда мы научились обращаться к ресурсам, давайте в файле activity_main.xml у TextView заменим текст на только что созданный строковый ресурс.
Запустим приложение и убедимся, что локализация действительно работает. После запуска приложения на эмуляторе, видим, что вывелась строка Resources , т.к. на эмуляторе стоит английский язык.
Давайте добавим русский язык и сделаем его основным. Для этого необходимо зайти в настройки системы и выбрать: System -> Languages & input -> Languages -> Русский. После добавления ставим русский язык первым:
Можем открыть приложение на эмуляторе или запустить его заново. Результат выглядит так:
Отображается надпись Ресурсы . Вот такое простое и элегантное решение предоставляет нам система для добавления поддержки новых языков. Стоит отметить, что помимо ручного заполнения файлов с ресурсами, существует возможность делать это через специальный редактор. Чтобы в него попасть необходимо, открыв файл со строковыми ресурсами (любого языка), в правом верхнем углу нажать кнопку «Open editor» (рус. Открыть редактор). Удобно использовать редактор, чтобы убедиться, что вы перевели все строки в приложении:
Вы можете заметить, что строка может быть нелокализируемой (поле untranslatable ). Примером могут быть технические термины, которые не переводят на другие языки: IMAP , NFC , GPS . Для таких строк в файле strings.xml необходимо установить атрибут translatable=»false» . В файлах для остальных языков не надо дублировать эти строки.
Доступ к ресурсам из Java кода
Также к ресурсам можно получить доступ из Java кода. Посмотрим на синтаксис.
Видим, что он очень похож на синтаксис доступа к ресурсу из XML. Параметры имя_пакета , тип_ресурса , имя_ресурса являются идентичными.
Доступ к нашему ресурсу можно получить так: R.string.app_name .
Когда приложение компилируется, автоматически генерируется класс R , который содержит идентификаторы для всех ресурсов в папке res/ . Для каждого типа ресурсов существует вложенный класс (например, R.string для всех строк), и для каждого ресурса этого типа существует целое число (например, R.string.app_name ). Из-за этого мы и можем получить доступ к ресурсу из Java кода.
Разберём на примере, как установить текстовый ресурс в TextView из Java кода:
Обратите внимание, что атрибут text мы не указали в XML файле.
Вначале мы связываем TextView из XML файла с Java кодом с помощью findViewById(R.id.text) . Потом получаем строку, используя getResources().getString(R.string.app_name) . После этого устанавливаем строку в TextView с помощью setText(appName) . Запустите приложение и убедитесь, что логика локализации не изменилась.
Зачем работать с ресурс файлами из Java кода, если можно из XML?
Бывают ситуации, когда вы заранее не можете знать, какой ресурс вы хотите использовать. Например, если в соц. сети человек уже прочитал сообщение, то вы хотите отобразить “Прочитано”, в другом случае – “Отправлено”. Именно в таких случаях необходимо работать с ресурсами из Java кода.
В Android системе лучше по умолчанию использовать строковые ресурсы даже если вы поддерживаете только один язык, чтобы в дальнейшем не было проблем с локализацией. Чтобы у вас сформировалась хорошая привычка во всех дальнейших примерах мы будем использовать именно строковые ресурсы вместо обычных строк.
Файл colors.xml
Файл colors.xml хранит в себе цвета приложения. Это удобно, потому что вы храните (изменяете при необходимости) цвет в одном месте. По умолчанию создаются цвета, которые используются в нашем приложении. Добавим ещё два цвета:
Используем эти цвета в layout файле, обращаясь к ним @color/background_light , @color/text_dark :
Теперь представьте, что дизайнер сказал вам изменить цвет текста с чёрного на тёмно синий, а фоновый цвет – с серого на тускло жёлтый. Изменяем только значения в colors.xml :
Доступ из Java кода осуществляется аналогично, как и со строковыми ресурсами. Разберём на примере:
С помощью getResources().getColor() получаем цвет, а используя setTextColor() , setBackgroundColor() устанавливаем цвета. В реальной жизни с этим часто приходится работать, когда в зависимости от статуса заказа товара в интернет-магазине изменяется фоновый цвет кнопки или контейнера.
Всегда храните все цвета приложения в файле colors.xml , чтобы легче было вносить изменения. Также это необходимо для использования нескольких тем (дневной и ночной) в приложении.
Файл styles.xml. Стили
Файл styles.xml нужен для того, чтобы объединять повторяющиеся атрибуты элементов в стили. Давайте откроем файл styles.xml :
По умолчанию в приложении создаётся стиль AppTheme , который задаёт основные цвета нашего приложения. Синтаксис создания стиля довольно простой:
Давайте на практике рассмотрим использование стилей. У нас есть такой layout , в котором у двух TextView повторяется множество атрибутов:
Мы можем вынести все эти атрибуты в новый стиль:
И после этого используем этот стиль в файле activity_main.xml , устанавливая атрибут style , передавая ему ссылку на стиль @style/Text :
Теперь, когда мы захотим поменять размер текста или изменить, добавить любой другой атрибут, то поменяем его в стиле Text . Стили позволяют избежать дублирование кода.
Наследование стилей
Наследование с помощью слова parent
Теперь давайте усложним задачу. Пусть первый текст будет тёмно синим, а второй – тёмно зелёным. Мы можем воспользоваться наследованием стилей. Создадим два новых стиля, которые будут наследовать стиль Text :
И применим эти стили в файле activity_main.xml :
Наследование с помощью символа . (точка)
Также есть возможность наследовать стили, используя символа . (точка). Изменим стили :
При таком подходе родительский стиль пишется вначале, после него – символ . (точка), а потом название дочернего стиля. Принципиальной разницы между этими двумя подходами наследования нет. Этот вариант выглядит более читабельным, когда названия стилей короткие.
Но у такого подхода есть ограничение: мы не можем его применять когда наследуемся от каких-то Android стилей, как например стиль AppTheme . В таким случаях мы обязаны использовать ключевое слово parent :
Переопределение атрибутов родительского стиля
Аналогично с наследованием классов в Java, мы можем переопределить атрибуты родительского стиля. Для примера переопределим атрибут textSize :
Папка drawable. Работа с картинками
Чтобы добавить картинку в приложение в первую очередь необходимо скачать картинку и добавить её в папку drawable . Давайте скачаем эту картинку для примера и добавим в папку drawable :
Доступ к картинке из XML кода
Также, как и к строкам, цветам, мы можем обращаться к картинкам из XML кода. Для этого необходимо указать ссылку на картинку в layout файле, используя элемент ImageView и атрибут android:src .
Доступ к картинке из Java кода
Также мы можем отобразить картинку, используя Java код. Выглядит это так:
Вначале мы достаём из ресурсов картинку с помощью getResources().getDrawable(R.drawable.android_jetpack) . Картинка в Java коде имеет тип Drawable . Далее, вызывая метод imageView.setImageDrawable() , мы устанавливаем картинку в ImageView . Можете запустить приложение и убедиться, что результат не изменился.
В Android системе существует намного больше различных ресурсов, таких как font , dimens , arrays . На первых этапах они вам не понадобятся. Но как только возникнет необходимость, вы сможете найти нужный вам ресурс и документацию по нему на официальном сайте.
Заключение
Ресурсы облегчают жизнь Android разработчика. Поэтому всегда используйте их при возможности. Вы потратите чуть больше времени сейчас на их создание, зато сэкономите кучу времени при добавлении новой функциональности в приложение. Сегодня вы познакомились с простейшей локализацией, использованием стилей, цветов и увидели реальную пользу от применения ресурсов.
Источник