Поделиться через


Основы ресурсов Android

Почти все приложения Android будут иметь в них некоторые ресурсы; по крайней мере они часто имеют макеты пользовательского интерфейса в виде XML-файлов. При первом создании приложения Xamarin.Android ресурсы по умолчанию настраиваются шаблоном проекта Xamarin.Android:

Пять файлов, составляющих ресурсы по умолчанию, были созданы в папке Resources:

  • Icon.png — значок по умолчанию для приложения

  • Main.axml — файл макета пользовательского интерфейса по умолчанию для приложения. Обратите внимание, что в то время как Android использует расширение .xml файла, Xamarin.Android использует расширение AXML-файла.

  • Strings.xml — строка таблицы для локализации приложения

  • AboutResources.txt — это не обязательно и может быть безопасно удалено. Он просто предоставляет общий обзор папки ресурсов и файлов в ней.

  • Resource.designer.cs — этот файл автоматически создается и поддерживается Xamarin.Android и содержит назначенный каждому ресурсу уникальный идентификатор. Это очень похоже и идентично для файла R.java, который будет иметь приложение Android, написанное на Java. Он автоматически создается средствами Xamarin.Android и будет повторно создан от времени.

Создание и доступ к ресурсам

Создание ресурсов так же просто, как добавление файлов в каталог для типа ресурса, который имеется в вопросе. На снимке экрана ниже показаны строковые ресурсы для немецких языковых стандартов, добавленных в проект. При добавлении Strings.xml в файл действие сборки автоматически установлено значение AndroidResource средствами Xamarin.Android:

Это позволяет средствам Xamarin.Android правильно компилировать и внедрять ресурсы в APK-файл. Если по какой-то причине действие сборки не задано для ресурса Android, файлы будут исключены из APK, и любая попытка загрузить или получить доступ к ресурсам приведет к ошибке во время выполнения, и приложение завершится сбоем.

Кроме того, важно отметить, что хотя Android поддерживает только строчные имена файлов для элементов ресурсов, Xamarin.Android немного более простительно; он будет поддерживать как верхний регистр, так и строчные имена файлов. Соглашение о именах изображений заключается в использовании нижнего регистра с символами подчеркивания в качестве разделителей (например, my_image_name.png). Обратите внимание, что имена ресурсов нельзя обрабатывать, если дефисы или пробелы используются в качестве разделителей.

После добавления ресурсов в проект существует два способа их использования в приложении — программно (внутри кода) или из XML-файлов.

Ссылки на ресурсы программным способом

Для доступа к этим файлам программным способом им назначается уникальный идентификатор ресурса. Этот идентификатор ресурса представляет собой целое число, определенное в специальном классе Resource, который находится в файле Resource.designer.cs, и выглядит примерно так:

public partial class Resource
{
    public partial class Attribute
    {
    }
    public partial class Drawable {
        public const int Icon=0x7f020000;
    }
    public partial class Id
    {
        public const int Textview=0x7f050000;
    }
    public partial class Layout
    {
        public const int Main=0x7f030000;
    }
    public partial class String
    {
        public const int App_Name=0x7f040001;
        public const int Hello=0x7f040000;
    }
}

Каждый идентификатор ресурса содержится внутри вложенного класса, соответствующего типу ресурса. Например, когда файл Icon.png был добавлен в проект, Xamarin.Android обновил Resource класс, создав вложенный класс, вызываемый Drawable константой внутри с именем Icon. Это позволяет называть файл Icon.png в коде Resource.Drawable.Icon. Resource Класс не должен быть изменен вручную, так как любые изменения, внесенные в него, будут перезаписаны Xamarin.Android.

При программном обращении к ресурсам (в коде) их можно получить через иерархию классов Resources, которая использует следующий синтаксис:

[<PackageName>.]Resource.<ResourceType>.<ResourceName>
  • PackageName — пакет, который предоставляет ресурс и требуется только при использовании ресурсов из других пакетов.

  • ResourceType — это вложенный тип ресурса, который находится в классе ресурсов, описанному выше.

  • Имя ресурса — это имя файла ресурса (без расширения) или значение атрибута android:name для ресурсов, которые находятся в XML-элементе.

Ссылка на ресурсы из XML

Доступ к ресурсам в XML-файле выполняется по следующему специальному синтаксису:

@[<PackageName>:]<ResourceType>/<ResourceName>
  • PackageName — пакет, который предоставляет ресурс и требуется только при использовании ресурсов из других пакетов.

  • ResourceType — это вложенный тип ресурса, который находится в классе Resource.

  • Имя ресурса — это имя файла ресурса (без расширения типа файла) или значение атрибута android:name для ресурсов, которые находятся в XML-элементе.

Например, содержимое файла макета Main.axml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    <ImageView android:id="@+id/myImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/flag" />
</LinearLayout>

В этом примере имеется ImageView флаг с именем рисуемого ресурса. У ImageView него задано значение src@drawable/flagатрибута. При запуске действия Android будет выглядеть внутри каталога Resource/Drawable для файла с именем flag.png (расширение файла может быть другим форматом изображения, например flag.jpg) и загрузить этот файл и отобразить его в файле ImageView. При запуске этого приложения будет выглядеть примерно следующее изображение:

Localized ImageView