Как работать с XML в Android — просто и по делу

XML‑файл в Android — это текстовый ресурс для описания интерфейсов, drawable, строк и конфигураций. Работать с ним нужно через папку res (res/layout, res/drawable, res/values) и AndroidManifest.xml: макеты инфлейтятся через LayoutInflater, ресурсы доступны через R, а большие XML парсятся асинхронно через XmlPullParser.

Что такое XML в Android и где это хранится

XML (Extensible Markup Language) в Android используют для описания иерархических данных: layouts, drawable‑ресурсов, значений и манифеста. Структура проекта:

  • res/layout/ — layout XML (activity_main.xml и т. п.).
  • res/drawable/ — shape, selector, vector XML.
  • res/values/ — strings.xml, colors.xml, dimens.xml, styles.xml.
  • корень проекта — AndroidManifest.xml (настройки приложения, разрешения).

Ресурсы компилируются AAPT2 и становятся доступными через класс R: R.layout.activity_main, R.string.app_name и т.д.

Типы XML и короткие примеры

Layout (res/layout/activity_main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_user"/>
</LinearLayout>

Values (res/values/strings.xml):

<resources>
    <string name="app_name">Моё приложение</string>
    <string name="hello_user">Привет, %s!</string>
</resources>

Drawable (res/drawable/bg_gradient.xml) — пример shape/gradient или selector для состояний.

Выносите все тексты в strings.xml для локализации и переиспользования.

Как создавать, редактировать и парсить XML

  1. Создание: в Android Studio — правый клик на res → New → Layout Resource File / Values Resource File.
  2. Редактирование: переключайтесь между Design и Code; пользуйтесь автодополнением и Lint.
  3. Инфлейт layout в коде:
val view = layoutInflater.inflate(R.layout.activity_main, null)
setContentView(view)
  1. Получение строки:
val s = getString(R.string.hello_user, "Пользователь")
  1. Парсинг произвольных XML (res/xml или assets) — XmlPullParser (прочитать в фоне):
val parser = resources.getXml(R.xml.sample)
var event = parser.eventType
while (event != XmlPullParser.END_DOCUMENT) {
    if (event == XmlPullParser.START_TAG && parser.name == "item") {
        val name = parser.getAttributeValue(null, "name")
        // обработка
    }
    event = parser.next()
}

Не парсьте большие XML на UI‑потоке — используйте Coroutines/Dispatchers.IO или фоновые потоки, чтобы избежать ANR.

Частые ошибки

  • Забыт namespace xmlns:android — layout не рендерится.
  • Хардкод строк вместо strings.xml — проблемы с локализацией.
  • Использование px вместо dp — элементы выглядят некорректно на других DPI.
  • Ошибка "Binary XML file line #X" — синтаксическая ошибка в XML, проверьте закрытие тегов и атрибуты.
  • R.layout не найден — опечатка в имени или ресурс не в той папке: сделайте Clean / Rebuild.

FAQ

  • Как поменять layout для ландшафта? Создайте папку res/layout‑land/ и положите туда альтернативный activity_main.xml.
  • Где хранить конфигурационные XML (не ресурсы)? В папке assets/ или raw/; доступ через AssetManager или resources.openRawResource().
  • Когда переходить на Jetpack Compose? Compose удобен для новых UI, но XML останется в legacy‑проектах и для некоторых инструментов.

Если нужно, могу дать чеклист для перевода конкретного layout в ConstraintLayout или пример парсинга сложного XML с Kotlin Coroutines.