- Resolving errors: missing constraints and hardcoded text in Android app development
- Constraint errors
- Hardcoded text warnings
- Hardcoded string button should use string resource
- Инъекция языка
- Перемещаем метод вверх или вниз
- Сворачиваем фрагменты кода
- Редактор кода для XML в режиме Text
- [I18N] Hardcoded string
- Вкладки
- Строка состояния
- Информационный желоб
- Анализ кода
- Автодополнение кода
- Перевод на новую строку
- Урок #9
- Класс R
- Строки
- Форматирование строк
- Локализация строк
- Цвета
Resolving errors: missing constraints and hardcoded text in Android app development
You may notice the editor sometimes has a red or yellow warning sign in the top right corner. These warning signs indicate there is a problem with our code that needs addressing. Red warnings indicate a critical error that will prevent the app from running, while yellow warnings are advisory.
Clicking the warning sign will tell us more about the error(s). For example, in the tutorial on adding a TextView object to our app, we caused «Missing Constraints in ConstraintLayout» and «Hardcoded text» errors. This tutorial will show you how to resolve these errors.
Constraint errors
Constraints are a set of rules which determine how an object positions itself relative to other objects and the layout as a whole. Without constraints, the objects in your app would likely jump out of position when the app is loaded or the device is rotated. To automatically apply any missing constraints you can press the ‘Infer Constraints’ button at the top of the editor.
The red warning sign should now have turned yellow because we have resolved the missing constraints error. Also, the TextView object should have blue arrows coming out of it when selected in the editor. These blue arrows represent the constraints. They determine how the TextView object will position itself relative to the edges of the app interface.
The infer constraints button adds any missing constraints and resolves the error, but what if you want to fine-tune the position of the object? To adjust the position of an object, select it and refer to the Attributes panel. In this example, inferring constraints created a top margin of 99dp.
A margin is a type of constraint that creates a fixed distance between the object and another reference point (e.g. another object or the edge of the app interface). In the above example, we can adjust the distance between the TextView object and the top of the app layout by editing the value of the layout_marginTop attribute. For instance, if you wanted to the TextView to sit near the top of the screen then you could set the layout_marginTop attribute to a small value such as 20dp.
An alternative method for adding constraints is to drag and drop the blue arrows yourself. To illustrate how this is done, add a second TextView object below the first one (for a reminder on how to add TextView objects see this tutorial). Next, select the original TextView object and notice the four circles which appear on each of its sides. Click the bottom circle and drag the arrow down to the top circle of the second TextView object. This creates a constraint connecting the two TextView objects. Note the second TextView object will now have some missing constraints of its own. You can fix this using the Infer Constraints button or by dragging the constraint arrows to the edge of the app layout yourself.
Hardcoded text warnings
While our objects now have the appropriate constraints, there is still a yellow warning sign in the top right corner of the editor.
This yellow warning sign is there because our two TextView objects contain hardcoded text. Hardcoded text can cause issues when the underlying code is being read and edited. Fortunately, hardcoded text is quite easy to rectify. Simply click the yellow warning sign in the top right corner, scroll to the bottom of the hardcoded text error message and press the ‘Fix’ button. In the Extract Resource window that opens, you can simply press OK and the attribute with the hardcoded text will be converted to string format.
For larger projects, it is often best to define any text (or strings) you intend to use in advance. That way you can prevent the hardcoded text warning from ever appearing. To define a string, open the strings resource file by clicking Project > app > res > values > strings.xml
There will likely already be some strings in there. Simply add new strings between the opening and closing resources tags in the following format:
The ‘name’ property is what you will use to refer to the string elsewhere in the app. The text between the two string tags will be displayed to the user whenever the string name is referred to. In other words, using the ‘title’ string will display ‘Coders’ Guidebook’.
Источник
Hardcoded string button should use string resource
Рассмотрим возможности редактора кода при написании приложений.
Инъекция языка
Студия позволяет делать инъекцию в существующий код. Что это такое? Например, JSON имеет свой формат данных. Если писать код вручную в данном формате, то можно столкнуться с неудобствами — вам приходится экранировать символы в большом фрагменте кода. Студия поможет нам. Создадим переменную jsonString:
Помещаем курсор между кавычками и нажимаем комбинацию Alt + Enter , выбираем пункт Inject language or reference, в выпадающем списке выбираем JSON (JSON files).
Далее следует ещё раз нажать комбинацию Alt + Enter , чтобы инъекция была постоянной. Студия добавит комментарий к переменной.
Если вы скопируете текст в формате JSON и вставите его между кавычками, то экранирование произойдёт автоматически.
Сам текст не обязательно копировать из другого источника, можете создавать JSON-запись в самой студии. Снова нажимаем Alt + Enter и выбираем пункт Edit JSON Fragment. Появится новая панель, в котором вы можете набирать текст, а в редакторе кода будет выводиться валидный код для работы.
Аналогично можно работать с регулярным выражением.
Перемещаем метод вверх или вниз
Иногда хочется для лучшей читаемости поменять местами методы в коде. Вырезать и вставлять в новое место слишком утомительно. Есть способ лучше. Установите указатель мыши на имени метода и нажмите комбинацию Ctrl+Shift+Стрелка_Вверх — метод автоматически перепрыгнет через метод над собой. Как переместить вниз вы сами догадаетесь.
Сворачиваем фрагменты кода
Студия умеет сворачивать фрагменты кода, которые являются структурной единицей, например, метод. Щёлкнув по фиговине (как это называется?), вы убираете код, чтобы не мозолил вам глаза.
Но мало кто знает, что свернуть можно любой свой код. Для этого ставим два слеша, как в комментариях, а затем добавляем слово region (без пробела) и через пробел название блока. Это будет началом блока. Конец блока обозначаем через //endregion
Теперь отмеченный блок можно сворачивать. Наведите порядок у себя в коде.
Редактор кода для XML в режиме Text
[I18N] Hardcoded string
Когда вы редактируете код разметки экрана активности, то можете встретить предупреждение [I18N] Hardcoded string «Какой-то ваш текст», should use @string resource.
Студия информирует вас о возможной проблеме, если вы в будущем задумаетесь о локализации приложения. Странное выражение I18N переводится очень просто. Здесь зашифровано слово INTERNATIONALIZATION — первая буква I, последняя буква N и восемнадцать букв между ними.
Вам нужно заменить свой жёстко закодированный текст на строковый ресурс. Установите курсор внутри текста, нажмите комбинацию клавиш Alt+Enter и выберите пункт Extract string resource. Далее в диалоговом окне придумываете имя для ресурса и выбираете файл для хранения (обычно, strings.xml).
Предположим, вы заменили везде текст на строковые ресурсы и решили отредактировать текст у кнопки. Снова ставим курсор на нужном тексте и нажимаем комбинацию клавиш Ctrl+B, у вас сразу откроется файл strings.xml и не надо его искать в дереве проекта.
Ещё один приём — если вы хотите видеть вместо кода andro реальный текст из ресурса, то нажмите комбинацию Ctrl+- (клавиша минус на цифровой клавиатуре) и он подтянется.
Вкладки
Каждый файл проекта открывается в собственной вкладке. Вкладки можно менять местами перетаскиванием с помощью мыши. Переключаться можно через клавиши Alt-стрелка влево и Alt-стрелка вправо. Также можно вызвать Switcher с помощью комбинации Ctrl+Tab.
Если будет открыто слишком много вкладок, то часть из них сгруппируется и будет доступна через выпадающий список по нажатию на треугольник.
Если имя файла на вкладке подчёркнуто красной волнистой линией, значит в коде содержится ошибка и не нужно запускать программы, то время потеряете. Сначала исправьте ошибку.
Вкладку можно «отстегнуть». Нажмите на вкладку и удерживая мышку, перетащите вкладку на рабочий стол. Также её можно вернуть обратно.
Каждая вкладка имеет контекстное меню и значок для закрытия. Изучите пункты меню самостоятельно. Например, можно разбить редактор кода на две части (по вертикали или горизонтали), чтобы видеть разные участки кода одновременно.
Строка состояния
В нижней части студии находится строка состояния. В нижнем правом углу имеется текстовая метка с информацией о текущем местоположении курсора в документе (номер строки:номер символа). Если подвести мышку к надписи, то можно увидеть всплывающую подсказку Click to go to line. Щелчок вызовет диалоговое окно для быстрого перехода на нужную позицию.
Рядом также имеется текстовая метка с указанием кодировки, в которой пишется код. В последних версиях студии это стало проблемой для русскоязычных программистов. Студия может использовать системную кодировку, которая часто бывает windows-1551, но в Android принято использовать UTF-8, и после запуска приложения вместо текста можно увидеть кракозябры.
Остальные элементы не представляют интереса.
Информационный желоб
Слева от редактора кода имеется отдельная полоска, которую я назвал информационным желобом. На ней можно увидеть различные значки. Например, у класса MainActivity выводится значок, связанный XML-разметкой для данного класса. Нажав на него, вы можете быстро открыть нужный XML-файл.
Также выводятся значки для методов. Каждый тип методов имеет свой цвет.
В данном желобе устанавливаются точки останова (breakpoint).
Доступно контекстное меню. Например, можно выбрать показ номеров строки.
На границе желоба и редактора кода имеются маркеры для сворачивания блоков кода.
Если нажать клавишу F11, то текущая строка будет помечена как закладка и появится галочка.
Анализ кода
Справа от редактора кода находится анализатор кода. Если код содержит ошибки, сверху будет гореть красный прямоугольник. Если ошибок нет, но есть предупреждения, то будет гореть жёлтый прямоугольник. При правильном коде горит зелёный прямоугольник.
В случае ошибок или предупреждений также выводятся зарубки. Если подвести к ним курсор мыши, то можно прочитать сообщение или сразу перейти в нужную строку для исправления, нажав на неё. Также есть синие зарубки для выделенных слов и задач TODO.
Автодополнение кода
Студия поддерживает автодополнение кода, когда по первым символам подставляет нужные слова. Распространяться на эту тему не буду.
Основная комбинация Ctrl+Space.
Если написать имя метода, например, «private void onClick()» и нажать комбинацию Ctrl+Shift+Enter, то студия сгенерирует фигурные скобки.
Когда у вас есть кусок кода и вы начинаете исправлять его, то возникает следующая ситуация. Студия предлагает подсказку, вы соглашаетесь и нажимаете Enter.
В данном случае мы хотим заменить переменную name на catName, но если нажмём на Enter, то подсказка присоединится к старому коду и мы получим catNamename. В следующий раз нажимайте на клавишу Tab и тогда старый вариант заменится на новый.
Также изучите другие клавиатурные комбинации.
Периодически используйте команды меню Code: Reformat Code и Rearrange Code. Первая команда полезна для Java-кода, а вторая для XML-разметки. Код станет аккуратнее.
Перевод на новую строку
Если курсор находится в середине выражения и вы хотите начать новую строку, не обязательно гнать курсор в конец строки. Просто нажмите комбинацию Shift+Enter.
Урок #9
Ранее в предыдущих уроках я неоднократно упоминал такое понятие, как ресурсы. Давайте разберемся, что это такое.
В ресурсах хранятся следующие вещи:
- Файлы верстки
- Строки, массивы строк
- Цвета
- Размеры
- Стили
- Анимации
- Меню
- И несколько других типов данных
На самом деле, вы уже работали с ресурсами, когда меняли верстку нашего пока что единственного экрана. Возможно, вы заметили, что Android Studio показывает предупреждения, например, для атрибута android:text у TextView :
Hardcoded string «Hello», should use @string resource
Все потому что строки в Android принято хранить в ресурсах. Почему? Потому что такой подход позволяет легко обрабатывать различные конфигурации. Под конфигурациями я имею в виду такие вещи, как, к примеру, язык (англоязычному пользователю показываем английский текст, русскоязычному — русский), плотность пикселей на экране (для дисплеев с высоким разрешением используем картинки в большем разрешении), тип устройства (для телефонов используем одну верстку, для планшетов — другую) и т.д. Также использование ресурсов позволяет избежать дублирования: вы можете использовать одну и туже строку (или, к примеру, цвет) в нескольких местах.
Класс R
Вы уже могли заметить, что мы используем некий таинственный класс R при обращении, например, к View по идентификатору. Класс R (от слова Resources) генерируется автоматически при сборке проекта (Android Studio генерирует его динамически — а раньше нужно было пересобирать проект). При помощи него мы можем обращаться к ресурсам (идентификатор View — тоже ресурс). Если вы его откроете, то увидите что-то вроде этого:
Изменять вручную этот файл нельзя. Точнее, можно, но он сгенерируется заново, и все ваши изменения пропадут.
Строки
Начнем с самого часто используемого: со строк. Строковые ресурсы хранятся в файле res/values/strings.xml . На самом деле, можно использовать несколько файлов, или переименовать файл — это не важно, главное, чтобы строки были внутри директории res/values .
Если вы откроете этот файл, то увидите, что там уже есть одна строка: это название нашего приложения.
Новые строки добавляются внутри тега . У строки есть атрибут name, в котором нужно обязательно указать уникальный идентификатор строки. Правила те же, что и для идентификаторов у View : латинские символы, цифры и знак подчеркивание, имя должно начинаться с буквы.
Внутри тега указываем, собственно, строку. Давайте перенесем значение атрибута android:text нашего TextView в строковые ресурсы. Добавьте новую строку в файл strings.xml , чтобы он выглядел вот так:
Теперь зададим эту строку в самом TextView (в файле activity_main.xml ). Для того, чтобы сослаться на строковый ресурс, нужно использовать следующий синтаксис: @string/name , где name — имя строки в strings.xml . Таким образом, TextView теперь выглядит вот так:
Форматирование строк
В Java-коде мы устанавливаем текст в TextView:
На самом деле, тут тоже лучше использовать ресурсы, и не складывать строки, а использовать форматирование. В строковом ресурсе мы можем задать «плейсхолдеры», которые будут заменены на переданный нами в качестве аргумента текст (не обязательно текст. можно использовать, например, числа). Пример:
В данном случае %1$s будет заменен на текст. %1 — порядковый номер (если мы будем форматировать 2 аргумента, то второй будет начинаться с %2 ), а $s — формат. У нас это строка, если мы будем использовать число — то это будет $d , если число с плавающей точкой — то $f (можно также указать точность, например $.2f — 2 знака после запятой).
Итак, добавьте эту строку в strings.xml , и замените Java-код на следующий:
Метод getString() получает строку из ресурсов, и форматирует её, используя переданные аргументы. Если строку не нужно форматировать, то передается только идентификатор строки.
Запустите приложение, чтобы убедиться, что все работает.
Локализация строк
Немаловажной задачей является локализация. Будет не очень хорошо, если вы покажете английский текст русскоязычному пользователю, не так ли?
Давайте переведем текст на русский язык. Нажмите правой кнопкой на директорию res , во всплывающем окне выберите New, затем Android resource file:
Создание нового файла ресурсов в Android Studio
В появившемся окне в поле File name введите «strings». Resource type — «values», Source set — «main», Directory name — «values»:
Создание файла ресурсов со строками
Снизу слева вы можете увидеть различные варианты, по которым мы можем дифференцировать конфигурацию пользовательского устройства. На данный момент нам нужен пункт Locale. Выберите его и нажмите на кнопку >> чуть правее. Появятся два дополнительных списка, Language и Specific Region Only. В списке Language выберите ru: Russian:
Выбор конфигурации для файла ресурсов
Регион оставьте Any Region. В таком случае любой пользователь, у которого в настройках устройства выбран русский язык, будет видеть текст на русском.
Выбор региона нужен для того, чтобы использовать ресурс только для пользователей с заданным языком из определенного региона. К примеру, если вы выберите Belarus, то строки на русском будут показываться только тем, кто живет в Беларуси, всем остальным они будут показываться на другом языке, даже если в настройках выбран русский язык.
После того, как вы нажмете на кнопку ОК, создастся новый файл:
Созданный файл строковых ресурсов
Как видите, он создался в директории res/values-ru , то есть values с русской локалью.
Файл пока почти что пуст: по умолчанию существующие строки добавляться в него не будут. Есть два варианта добавления строк для перевода:
- Добавить строку вручную.
- Воспользоваться встроенным редактором переводов.
В первом случае просто скопируйте строку из оригинального файла и вставьте в новый, после чего переведите. Например, я скопирую первые две строки — имя приложения и приветственный текст. Теперь мой файл выглядит так:
Второй вариант в теории должен быть удобнее, на практике же его реализация на данный момент оставляет желать лучшего. Откройте любой strings.xml . Вверху справа вы увидите кнопку Open editor:
Кнопка «Open Editor»
Нажмите на нее. Откроется редактор строк:
Редактор строк в Android Studio
Непереведённые строки подсвечиваются красным. Давайте переведем. Для этого поставьте курсор в соответствующую ячейку и введите текст. Получится вот так:
Редактор строк в Android Studio
А русский файл строк теперь выглядит так:
Почему я сказал, что реализация оставляет желать лучшего, ведь это так удобно? Да, это удобно, когда вы работаете с такими маленькими строками и когда у вас всего две локали. Когда строки перестают умещаться в экран и количество локалей превышает 3, работа с этим инструментом превращается в ад, и приходится редактировать файлы строк вручную. На самом деле, это не так страшно, так что не пугайтесь и обязательно всегда переводите приложение 🙂
Точно так же локализация работает и для других ресурсов: создайте директорию в ресурсах (либо методом, показанным выше, либо вручную) с соответствующим названием и скопируйте туда нужные локализованные ресурсы.
По умолчанию (если для конфигурации пользователя не найдены ресурсы в приложении) берутся стандартные ресурсы. То есть, например, в нашем случае, пользователь с белорусской локалью увидит текст на английском.
Цвета
Цвета хранятся в директории res/values в файле colors.xml . Откройте этот файл:
Как видите, в нем уже есть три цвета. Эти цвета сгенерировала Android Studio при создании проекта.
Они нужны для стилизации приложения — вы могли заметить, что первый цвет — это цвет верхней части приложения, второй — цвет статусбара, а третьим подсвечивается поле для ввода текста.
I am new in Android app development and using Java language. My problem is every time I make a TextView or Button there is a triangle with the exclamation mark below them. and when I click it I saw a message saying:
hardcoded string “Button”, should use @string resource
I have two activities, in my main activity there is a Button that when you click it you will go in second activity. But when I go to my main.java to make a code for the button. There’s always the above shown error. I think the eclipse can’t find the id of my button and same for my TextView they have same error message.
Here is the code I made:
I am using the latest eclipse classic and ADT august issue. The platform is Android 4.1 API 16.
Источник