- Lesson 1.3: How to modify TextView in Java code (findViewById, setText and getText methods)
- Step 1. Adding ID to TextView
- Styling internationalized text in Android
- Basic text styling with HTML tags
- Complex text styling with Annotation
- Bonus section: Annotation spans and text parceling
- Underspanding spans
- Spans are powerful concepts that allow styling text at character or paragraph levels by providing access to components…
- Android Ресурсы . Работа со строками, цветами, стилями, картинками
- Ресурсы
- Ресурсы из папки res/values
- Файл string.xml. Локализация
- Доступ к ресурсам из XML
- Доступ к ресурсам из Java кода
- Зачем работать с ресурс файлами из Java кода, если можно из XML?
- Файл colors.xml
- Файл styles.xml. Стили
- Наследование стилей
- Наследование с помощью слова parent
- Наследование с помощью символа . (точка)
- Переопределение атрибутов родительского стиля
- Папка drawable. Работа с картинками
- Доступ к картинке из XML кода
- Доступ к картинке из Java кода
- Заключение
Lesson 1.3: How to modify TextView in Java code (findViewById, setText and getText methods)
We have already presented some text on the screen using layout XML file. This is recommended approach, but if we want to modify that text we have to use Java.
If you are new to Java read a few lessons called Java basics that we have already published ( they are a part of Lesson 0 set ). We’re going to use concepts like classes, methods and variables explained there.
In the lesson 1.1 we were using TextView tag. TextView is also Android class for displaying text. So in Java code we would use it too, but instead of attributes we will modify it by methods.
There are three scenarios:
- Modifying a text added in layout XML file.
- Adding a TextView directly in Java instead of layout XML file.
- Adding additional TextView elements beside that from layout XML file.
Now we focus only on scenario 1, leaving 2 & 3 for future lessons.
We finished previous lesson displaying I’m the best from strings.xml file. But imagine that we would like to change this text to I love you. Of course to make such an amazing Valentine’s app we could just modify a content of strings.xml file, but let’s assume that firstly we want to show I’m the best and later change it to a new string.
To achieve this goal we have to accomplish two tasks: find TextView in layout file and then change a text it displays.
Step 1. Adding ID to TextView
The easiest way to find element of the Android app layout is to use its ID. We could add our own IDs to almost every XML tags. To add ID we use android:id attribute.
Источник
Styling internationalized text in Android
In a previous article we talked about styling characters or paragraphs in Android using spans. But all the examples used were based on hard coded text, where we knew exactly at which indexes to apply the span. Most of the time, the text we work with comes from resources and is internationalized. So the text we need to style and its positioning within a sentence may change.
For example, let’s say that we have the string “ Best practices for text on Android” in English and Spanish, and we want to style the word “ text”.
We end up having to style different words, “ text” and “ Texto”, that have different positions in the strings they belong to, so looking for occurrences of a specific word is not a feasible task. Depending on what kind of styling we want to apply, we have multiple ways of styling internationalized text: by using HTML tags or using the Annotation span together with the annotation tag.
Basic text styling with HTML tags
If you only want to apply basic styling, use HTML tags in the string resources or Html.fromHtml . The following styling is supported:
- Bold: ,
- Italic: , ,
- 25% increase in text size
- 20% decrease in text size
- Setting font properties: . Examples of the possible font families include monospace , serif and sans_serif .
- Setting a monospace font family:
- Strikethrough:
,, - Underline:
- Superscript:
- Subscript:
- Bullet points:
- ,
- Line breaks:
- Division:
For example, to have the word “ text” bold, the text in the strings.xml would be this:
In the UI, the text can be set like this:
Complex text styling with Annotation
If your styling needs exceed the capabilities supported by HTML tags, or if you want to use custom styles, like custom bullet point styling or even completely new styles, then we need another solution. Mark the words to be styled and work with the android.text.Annotation class and the corresponding tag in the strings.xml resource files.
The annotation tag allows us to define custom pairs in the xml. When getting string resources as SpannedString , these pairs are automatically converted by the Android framework into Annotation spans, with the corresponding key and value. We can then parse the list of annotations attached to the text and add the right span to our text.
Let’s say that we want to set a custom typeface, by applying a CustomTypefaceSpan to the word “text”. Here’s what we need to do:
2. Get the string from resources, iterate through the annotations and get the ones with the key font and the corresponding value. Then create the custom span and set it to text in the same positions as the annotation span.
You can find the complete code for this example here.
For a more complex example, in Java, using Annotations to add an image to the text and to set the foreground color, check out this commit from Plaid.
If you’re using the same text several times, for example in a RecyclerView , and you reconstruct the SpannableString for every item, there are some performance and memory implications you need to keep in mind:
- The string is iterated multiple times: once by the framework to add the Annotation spans and once by you, to manually add your spans
- A new instance of the SpannableString is created for every item.
To solve this, build the text only once, cache and then reuse the SpannableString .
Bonus section: Annotation spans and text parceling
In a previous article we mentioned that only framework spans are parceled when styled text is passed either in the same process (via Intent bundles, for example) or in between processes (by copying text).
Underspanding spans
Spans are powerful concepts that allow styling text at character or paragraph levels by providing access to components…
Because Annotation spans are also ParcelableSpan s, then the pairs are parceled and unparceled, making the Annotation span a way of applying custom styling to text that is parceled, as long as the receiving end knows how to interpret the annotations.
So, to keep your custom styling when you pass the text to an Intent Bundle, you first need to add Annotation spans to your text. You can do this in the XML resources via the tag, like shown above, or in code by creating a new Annotation and setting it as a span:
Retrieve the text from the Bundle as a SpannableString and then parse the Annotations attached, like in the example above.
For simple styling of internationalized text, update your string resources to use HTML tags. But when your styling needs exceed the limits of the supported HTML tags, use the Annotation span and the associated annotation tag. As an extra benefit, the Annotation spans are parcelable, so you can style your text easily, no matter how you work with it.
For more best practices with text, checkout the Google I/O 2018 talk:
Источник
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 разработчика. Поэтому всегда используйте их при возможности. Вы потратите чуть больше времени сейчас на их создание, зато сэкономите кучу времени при добавлении новой функциональности в приложение. Сегодня вы познакомились с простейшей локализацией, использованием стилей, цветов и увидели реальную пользу от применения ресурсов.
Источник