Udostępnij za pośrednictwem


Podstawowe informacje dotyczące zasobów systemu Android

Prawie wszystkie aplikacje systemu Android będą miały w sobie jakieś zasoby; co najmniej mają układy interfejsu użytkownika w postaci plików XML. Po pierwszym utworzeniu aplikacji platformy Xamarin.Android domyślne zasoby są konfigurowane przez szablon projektu Xamarin.Android:

Pięć plików tworzących zasoby domyślne zostały utworzone w folderze Resources:

  • Icon.png — ikona domyślna aplikacji

  • Main.axml — domyślny plik układu interfejsu użytkownika dla aplikacji. Należy pamiętać, że podczas gdy system Android używarozszerzenia .xml pliku, platforma Xamarin.Android używa rozszerzenia pliku .axml.

  • Strings.xml — tabela ciągów, która ułatwia lokalizację aplikacji

  • AboutResources.txt — nie jest to konieczne i może zostać bezpiecznie usunięte. Zawiera on tylko ogólne omówienie folderu Resources i plików w nim.

  • Resource.designer.cs — ten plik jest automatycznie generowany i obsługiwany przez platformę Xamarin.Android i przechowuje unikatowy identyfikator przypisany do każdego zasobu. Jest to bardzo podobne i identyczne w celu R.java pliku, który miałby aplikacja systemu Android napisana w języku Java. Jest on tworzony automatycznie przez narzędzia platformy Xamarin.Android i zostanie ponownie wygenerowany od czasu do czasu.

Tworzenie zasobów i uzyskiwanie do ich dostępu

Tworzenie zasobów jest tak proste, jak dodawanie plików do katalogu dla danego typu zasobu. Poniższy zrzut ekranu przedstawia zasoby ciągów dla niemieckich ustawień regionalnych zostały dodane do projektu. Po dodaniu Strings.xml do pliku akcja kompilacji została automatycznie ustawiona na AndroidResource przez narzędzia platformy Xamarin.Android:

Dzięki temu narzędzia platformy Xamarin.Android mogą prawidłowo kompilować i osadzać zasoby w pliku APK. Jeśli z jakiegoś powodu akcja kompilacji nie jest ustawiona na zasób systemu Android, pliki zostaną wykluczone z pakietu APK, a każda próba załadowania lub uzyskania dostępu do zasobów spowoduje błąd czasu wykonywania, a aplikacja ulegnie awarii.

Należy również pamiętać, że chociaż system Android obsługuje tylko małe nazwy plików dla elementów zasobów, platforma Xamarin.Android jest nieco bardziej forgiving; będzie obsługiwać zarówno wielkie, jak i małe nazwy plików. Konwencją nazw obrazów jest użycie małych liter z podkreśleniami jako separatorami (na przykład my_image_name.png). Należy pamiętać, że nazwy zasobów nie mogą być przetwarzane, jeśli łączniki lub spacje są używane jako separatory.

Po dodaniu zasobów do projektu istnieją dwa sposoby ich używania w aplikacji — programowo (wewnątrz kodu) lub z plików XML.

Programowe odwoływanie się do zasobów

Aby uzyskać dostęp do tych plików programowo, są one przypisane unikatowy identyfikator zasobu. Ten identyfikator zasobu jest liczbą całkowitą zdefiniowaną w klasie specjalnej o nazwie Resource, która znajduje się w pliku Resource.designer.cs i wygląda następująco:

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;
    }
}

Każdy identyfikator zasobu jest zawarty w zagnieżdżonej klasie, która odpowiada typowi zasobu. Na przykład gdy plik Icon.png został dodany do projektu, Xamarin.Android zaktualizował Resource klasę, tworząc klasę zagnieżdżona o nazwie Drawable ze stałą o nazwie Icon. Dzięki temu plik Icon.png może być określany w kodzie jako Resource.Drawable.Icon. Klasa Resource nie powinna być edytowana ręcznie, ponieważ wszelkie zmiany wprowadzone w niej zostaną zastąpione przez platformę Xamarin.Android.

W przypadku programowego odwoływania się do zasobów (w kodzie) można uzyskać do nich dostęp za pośrednictwem hierarchii klas Resources, która używa następującej składni:

[<PackageName>.]Resource.<ResourceType>.<ResourceName>
  • PackageName — pakiet dostarczający zasób i jest wymagany tylko wtedy, gdy są używane zasoby z innych pakietów.

  • ResourceType — jest to zagnieżdżony typ zasobu, który znajduje się w klasie Resource opisanej powyżej.

  • Nazwa zasobu — jest to nazwa pliku zasobu (bez rozszerzenia) lub wartość atrybutu android:name dla zasobów, które znajdują się w elemecie XML.

Odwoływanie się do zasobów z pliku XML

Zasoby w pliku XML są dostępne za pomocą następującej specjalnej składni:

@[<PackageName>:]<ResourceType>/<ResourceName>
  • PackageName — pakiet dostarczający zasób i jest wymagany tylko wtedy, gdy są używane zasoby z innych pakietów.

  • ResourceType — jest to typ zasobu zagnieżdżonego, który znajduje się w klasie Resource.

  • Nazwa zasobu — jest to nazwa pliku zasobu (bez rozszerzenia typu pliku) lub wartość atrybutu android:name dla zasobów, które znajdują się w elemecie XML.

Na przykład zawartość pliku układu Main.axml jest następująca:

<?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>

Ten przykład zawiera element ImageView , który wymaga zasobu możliwego do rysowania o nazwie flaga. Właściwość ImageView ma swój src atrybut ustawiony na @drawable/flagwartość . Po uruchomieniu działania system Android będzie wyglądał wewnątrz katalogu Resource/Drawable dla pliku o nazwie flag.png (rozszerzenie pliku może być innym formatem obrazu, takim jak flag.jpg) i załadować ten plik i wyświetlić go w ImageViewpliku . Po uruchomieniu tej aplikacji będzie ona wyglądać podobnie do poniższej ilustracji:

Localized ImageView