Как работать с 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
- Создание: в Android Studio — правый клик на res → New → Layout Resource File / Values Resource File.
- Редактирование: переключайтесь между Design и Code; пользуйтесь автодополнением и Lint.
- Инфлейт layout в коде:
val view = layoutInflater.inflate(R.layout.activity_main, null)
setContentView(view)
- Получение строки:
val s = getString(R.string.hello_user, "Пользователь")
- Парсинг произвольных 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.