Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Пространство имён Tools

При создании нового проекта, когда вы проектировали макет для экрана активности, то, наверняка, замечали загадочные строчки у корневого элемента со словом tools:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:clipChildren="false"
    android:clipToPadding="false"
    tools:context=".MainActivity">

Настало время сорвать покровы и использовать новые возможности.

Привычное пространство имён xmlns:android позволяет настраивать внешний вид и поведение компонентов в Android-приложении. А новое пространство имён xmlns:tools позволяет среде разработки (в нашем случае, Android Studio) правильно отобразить компоненты для просмотра в режиме дизайна.

Причём возможности данного инструмента гораздо выше, чем многие себе представляют.

Для начала приведу простой пример, который многие оценят по достоинству. Представьте себе, что у вас есть компонент пустой TextView, который получает текст с сервера. Чтобы визуально представить себе, как будет выглядеть текст, не соединяясь с сервером, вам нужно временно присвоить какой-нибудь текст. А потом не забыть удалить его при создании релиза. А можно поступить проще. Инструмент tools дублирует многие визуальные атрибуты пространства имён android и вы можете заменить его следующим образом.


<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    tools:text="@string/hello_world" />

В реальности у текстовой метки нет текста, но в окне предварительного просмотра вы можете видеть текст и оценить дизайн. Напомню, что эта настройка относится только к среде разработки, а не к вашему приложению. Поэтому теперь можно не волноваться, что однажды вы забудете удалить временный текст. Попробуйте теперь поменять цвет фона с помощью атрибута tools:background ="#ваш_цвет". Получилось?

Lint

Кроме визуальных атрибутов, tools может использоваться для взаимодействия с инструментом Lint, который пытается подсказать при проблемном коде. К этим атрибутам можно отнести

  • tools:ignore
  • tools:targetApi
  • tools:locale

tools:ignore

Атрибут tools:ignore похож по своему поведению на Java-аннотацию @SuppressWarnings, подсказывающему инструменту Lint не обращать внимания на код. Аналогично можно не обращать на какой-то атрибут в XML-файле.

Самый распространённый случай - использование ImageView. Lint всегда недоволен, если у данного компонента нет атрибута android:contentDescription. Профессионально сделанное приложение должно использовать данный атрибут. Но в некоторых ситуациях ImageView может быть вспомогательным элементом экрана, не несущим смысловой нагрузки, например, разделитель. И тогда можно подавить предупреждение следующим образом.


<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="center"
    android:src="@drawable/divider"
    tools:ignore="contentDescription" />

tools:targetApi

Атрибут tools:targetApi работает аналогично аннотации @TargetApi и говорит о минимальной версии API, которая будет использована для ресурсов.

Например, ваш проект использует минимальный уровень minSdkLevel = 15, а вы используете объекты RippleDrawable в качестве ресурсов в общей папке, а не в папке drawable-v21. Но если вы контролируете ситуацию и знаете, что для старых устройств есть другие ресурсы, то можете подавить предупреждение:


<ripple xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:color="@color/accent_color"
  tools:targetApi="LOLLIPOP" />

tools:locale

Атрибут tools:locale поможет вам подавить предупреждения Lint о неправильном правописании, выступая в качестве грамар-наци. Проблема в том, что Lint содержит проверку орфографии только на английском языке. И если ваши строковые ресурсы содержат русский текст, то его предупреждения бесполезны. Отключаем их:


<resources
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  tools:locale="ru">
 
  <!-- Строковые ресурсы -->
 
</resources>

Рассмотрим теперь другие доступные атрибуты.

tools:context

Атрибут tools:context у корневого элемента позволяет определить связь между макетом и классом активности, в которой данный макет будет реализован. Помогает студии сформировать в окне предварительного просмотра внешний вид, подтягивая нужную тему.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...
    tools:context=".MainActivity">

tools:layout

Атрибут tools:layout используется в разметке фрагмента, чтобы вывести макет фрагмента на экране активности.


<fragment 
    android:name="com.example.master.ItemListFragment" 
    tools:layout="@android:layout/list_content" />

tools:showIn

Атрибут tools:showIn позволяет указать, какую разметку нужно использовать для вывода в окне предварительного просмотра. Это может пригодиться для тега merge:


<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:showIn="@layout/activity_main">

tools:menu

Атрибут tools:menu подсказывает среде разработке, какое меню нужно отобразить в окне предварительного просмотра. Также используется в корневом элементе разметки.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...
    tools:menu="menu_main, menu_second"
    tools:context=".MainActivity">

Можно через запятую указать несколько меню, заданных в папке res/menu. Также кроме имени XML-файла можно использовать идентификаторы меню без символа @. В окне предварительного просмотра вы можете вызвать меню и нажать на пункт меню - вас сразу перенесёт в нужный файл.

Если не хотите выводить меню, то оставьте пустую строку. Данный атрибут не работает с темой Theme.AppCompat и производных от неё.

tools:actionBarNavMode

Атрибут tools:actionBarNavMode отвечает за внешний вид панели действий ActionBar. Он также размещается в корневом элементе разметки, не работает с темами Theme.AppCompat и Theme.Material и не действует при использовании Toolbar вместо ActionBar.

Доступны три варианта:

  • standard
  • list
  • tabs

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...
    tools:menu="menu_main, menu_second"
    tools:actionBarNavMode="tabs"
    tools:context=".MainActivity">

tools:listitem / listheader / listfooter

Также можно настроить внешний вид компонентов на основе AdapterView - ListView, GridView, ExpandableListView и т.д., указав нужную разметку для отдельных элементов списка, а также заголовка и футера. Появилась поддержка и RecyclerView.


<ListView
    ...
    tools:listitem="@android:layout/simple_list_item_2"/>

Атрибуты для заголовка и футера могут работать только для ListView, а для GridView не работает.

Для сравнения как выглядят экраны активности с использованием tools: и без него.

tools

tools

Мы видим вкладки, элементы меню, другую разметку для списка.

tools:layoutManager

В RecyclerView можно использовать менеджер разметок с указанием различных параметров.


tools:layoutManager="GridLayoutManager"
tools:spanCount="2"

tools:itemCount

Обычно студия выводит десять элементов списка в RecyclerView. Вы можете изменить это поведение данным атрибутом.

tools:openDrawer

В студии 1.4 появился новый атрибут tools:openDrawer, управляющий состоянием навигационной шторки для DrawerLayout. При значении start будет показана шторка в выдвинутом виде. Доступны значения: start, end, left, right.

tools:minValue/tools:maxValue

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

tools:src

Можно указать графический ресурс. Полезно для ImageView, когда используется пустое изображение при запуске приложения и затем скачивается картинка с сервера. Позже появилась другая удобная возможность (см. ниже)

tools:layout_height/tools:layout_width

Ширина и высота.

tools:background

Фон.

tools:src="@tools:sample/..."

В студии версии 3.0 появились новые возможности. Теперь вы можете задать аватар, имя и случайный текст без создания собственных ресурсов. Это бывает полезно, когда ресурсы берутся из внешнего источника. Вам не нужно создавать временные ресурсы, которые увеличивают размер приложения и которые можно забыть удалить.

Например, можно задать изображение для ImageView:


tools:src="@tools:sample/avatars"

Если у вас несколько ImageView, то изображения будут разными! Просмотреть весь набор можно в папке ..\plugins\android\lib\sampleData.

Можно задать текст для TextView:

  • tools:text="@tools:sample/full_names" - полное имя (также first_names, last_names)
  • tools:text="@tools:sample/cities" - город
  • tools:text="@tools:sample/us_zipcodes" - индексы США
  • tools:text="@tools:sample/us_phones" - телефонные номера США в формате (800) 555-xxxx
  • tools:text="@tools:sample/date/ddmmyy" - дата (date/day_of_week, date/mmddyy, date/hhmm, date/hhmmss)
  • tools:text="@tools:sample/lorem" - случайный текст
  • tools:text="@tools:sample/lorem/random" - большой случайный текст

Можно задать случайный фон


tools:background="@tools:sample/backgrounds/scenic"

Пример применения некоторых атрибутов.

tools

Но это ещё не всё. Если вас не устраивают изображения (там нет котов!) или тексты, предлагаемые студией, то можно задать свои изображения и тексты. Из контекстного меню папки res выбираем New | Sample Data Directory. В модуле app появится папка sampleData. Создайте текстовый файл с именем names и добавьте построчно различные имена: Барсик, Мурзик, Рыжик, Васька и т.д.

Заменим tools:text="@tools:sample/full_names" на tools:text="@sample/names". Теперь вместо непонятных иностранных имён будут отображаться правильные нормальные имена.

По такому же принципу можно создать собственные изображения для аватаров. В папке sampleData создайте подпапку avatars (имя произвольное) и разместите в ней нужные файлы изображений.

Используем атрибут для аватаров - tools:src="@sample/avatars".

Можно создать сложный вариант сочетаний имён и городов. Опять в той же папке sampleData создаём JSON-файл следующего содержания.


{
  "data": [
    {
      "city": "Murmanks, Russia",
      "avatar": "@sample/avatars"
    },
    {
      "city": "Minks, Belarus",
      "avatar": "@sample/avatars"
    },
    {
      "city": "Moscow, Russia",
      "avatar": "@sample/avatars"
    },
    {
      "city": "Kiev, Ukraine",
      "avatar": "@sample/avatars"
    }
  ]
}

Можете обращаться к созданному файлу через атрибуты:


// ImageView
tools:src="@sample/users.json/data/avatar"

// TextView
tools:text="@sample/users.json/data/city"
Реклама