Az Android platform egy sajátos erőssége a rugalmas erőforráskezelés, amely lehetővé teszi, hogy a felhasználói felület dinamikusan alkalmazkodjon az operációs rendszer verziójához. A témák (themes) különösen fontos szerepet játszanak ebben, mivel közvetlenül befolyásolják az alkalmazás vizuális megjelenését és viselkedését. Annak érdekében, hogy az alkalmazás megjelenése modern maradjon az új eszközökön, de ugyanakkor kompatibilis legyen a régebbiekkel is, érdemes kihasználni az Android által kínált verzió-alapú erőforrásválasztás (resource selection) lehetőségét.

A modern fejlesztési gyakorlatban gyakori, hogy az alkalmazás fő témáját egyéni módon definiáljuk, és különböző stílusokat (styles) alkalmazunk az API szinttől függően. Ehhez először létre kell hozni az AutomaticTheme nevű új stílust, amely minden verzióhoz megfelelő név alatt szerepel, de minden egyes verzióra különböző megjelenést határoz meg.

Az alapvető megközelítés az, hogy három különböző styles.xml fájlt hozunk létre: az alapértelmezett res/values, a res/values-v11 és a res/values-v21 könyvtárakban. Ezek a mappák az Android rendszer által automatikusan kiválasztásra kerülnek az eszköz API verziója alapján. A values-v11 mappa a Honeycomb (API 11) verziótól kezdve elérhető Theme.Holo témát használja, míg a values-v21 a Lollipop (API 21) utáni Theme.Material témát deklarálja. A név mindhárom fájlban azonos marad (AutomaticTheme), így az Android rendszer képes automatikusan a megfelelő változatot alkalmazni, anélkül hogy külön logikát kellene írni erre.

Az Android Studio-ban való munkavégzés során figyelembe kell venni, hogy az alapértelmezett beállítás gyakran az AppCompat könyvtárakat használja. Mivel ebben az esetben explicit módon szeretnénk a rendszertémákat használni, kerülni kell az AppCompatActivity használatát, és a MainActivity-t közvetlenül az Activity osztályból kell leszármaztatni. Ez biztosítja, hogy a rendszer saját témakezelése érvényesülhessen mindenféle támogatói réteg nélkül.

A téma beállítása az AndroidManifest.xml fájlban történik az android:theme attribútum megadásával, amelyet az alkalmazás szintjén, vagy akár csak az adott aktivitás szintjén is definiálhatunk. Ez különösen akkor hasznos, ha például párbeszédpanel-szerű aktivitást szeretnénk létrehozni, amelyhez windowIsFloating beállítást használunk egy egyéni stílusban.

Bár technikailag egyszerűbb lenne egyetlen témát módosítani (például az AppTheme-hez hozzáadni a szükséges beállításokat), ez hosszú távon rugalmatlansághoz vezethet, különösen, ha az alkalmazás több aktivitást vagy különböző felhasználói élményt kínál. Ha például az AppTheme-hez hozzáadjuk a windowIsFloating beállítást, minden új aktivitás párbeszédpanelként jelenne meg, ami nem mindig kívánatos.

A rendszereszközök verzióalapú kiválasztása nemcsak témák esetében működik, hanem bármely más erőforrás esetében is: elrendezések, képek, dimenziók, színek stb. Alapértelmezett Android fejlesztői technika az is, hogy a képernyő mérete, orientációja vagy felbontása alapján külön mappákba szervezünk erőforrásokat (layout-sw600dp, drawable-hdpi, values-land stb.). A témák verzióalapú szelekciója ebbe a rendszerbe illeszkedik bele.

A menük implementálása során – legyen szó opciós menüről, kontextuális műveleti módról vagy felugró menüről – a megfelelő megjelenés szintén a témákhoz kapcsolódik. A Menu API háromféle menütípust támogat, amelyek viselkedését és stílusát szintén befolyásolhatja

Hogyan készítsünk kezdőképernyőn elhelyezhető widgeteket és parancsikonokat Android alkalmazásokban?

A kezdőképernyőn való widgetek és parancsikonok létrehozása rendkívül praktikus módja annak, hogy a felhasználók közvetlen hozzáférést nyerjenek alkalmazásunk bizonyos funkcióihoz anélkül, hogy meg kellene nyitniuk magát az alkalmazást. Ahhoz, hogy ezt elérjük, először meg kell értenünk, hogyan működik a parancsikonok és widgetek létrehozása az Android rendszeren.

A parancsikonok elhelyezése a kezdőképernyőn egyszerű folyamat, miután megadjuk a megfelelő jogosultságokat. Az alapvető működés az, hogy amikor a felhasználó rákattint a parancsikonra, egy új "intent" (szándék) kerül végrehajtásra. Ez az intent hívja meg az alkalmazásunk egy adott funkcióját. A parancsikon létrehozásához szükséges második intent, az installIntent felelős magának a parancsikon tényleges létrehozásáért. Ha pedig eltávolítani szeretnénk a parancsikont, akkor egy másik jogosultság szükséges. Az INSTALL_SHORTCUT akció helyett az UNINSTALL_SHORTCUT akciót kell használnunk.

A widgetek létrehozása már egy kicsit bonyolultabb, mivel itt több komponensre is szükség van. Három kötelező és egy opcionális elemet kell tartalmaznia a widgetnek. A kötelező elemek a következők:

  • AppWidgetProviderInfo fájl: Ez egy XML fájl, amely meghatározza a widget alapvető beállításait.

  • AppWidgetProvider osztály: Ez egy Java osztály, amely az események kezelésére szolgál.

  • Layout fájl: Ez egy szabványos XML fájl, amely a widget megjelenését definiálja, de bizonyos korlátozásokkal.

  • App Widget konfigurációs Activity (opcionális): Ez az Activity akkor indul el, amikor a widgetet a kezdőképernyőre helyezik, hogy a felhasználó beállíthassa az alapértelmezett konfigurációkat.

A widgetek viselkedését és megjelenését a AppWidgetProvider osztály szabályozza, amely a BroadcastReceiver osztályból származik, ezért képes az operációs rendszer által küldött üzenetek fogadására is. A fontosabb metódusok, amelyeket az AppWidgetProvider tartalmaz, a következők:

  • onUpdate(): Ezt akkor hívja meg a rendszer, amikor a widgetet létrehozzák, illetve az intervallum szerint frissítik.

  • onAppWidgetOptionsChanged(): Ez akkor hívódik meg, ha a widget mérete megváltozik.

  • onDeleted(): Ezt akkor hívja meg a rendszer, ha a widgetet eltávolítják.

  • onEnabled(): Ez akkor fut le először, amikor a widgetet a kezdőképernyőre helyezik.

  • onDisabled(): Ezt akkor hívja meg a rendszer, amikor az utolsó widgetet eltávolítják.

  • onReceive(): Ez a metódus minden egyes eseményt kezel, beleértve az előzőekben említett eseményeket is.

Fontos megjegyezni, hogy az App Widgetek a Remote Views technológiát használják, és ennek megfelelően csak bizonyos típusú layout-ok és widgetek használhatók. A támogatott layout-ok közé tartozik a FrameLayout, LinearLayout, RelativeLayout és a GridLayout, míg a widgetek közül például az AnalogClock, Button, Chronometer, ImageView, TextView és a ProgressBar mind használhatóak.

A widgetek felhasználásának másik fontos aspektusa, hogy bár az Android rendszer képes több widgetet is kezelni a kezdőképernyőn, az egyes widgetek konfigurációs lehetőségeit a felhasználói élmény érdekében úgy kell megtervezni, hogy azok ne legyenek túlterhelve felesleges beállításokkal.

A widgetek és parancsikonok alkalmazásba történő integrálása nemcsak a felhasználói élményt javítja, hanem kényelmesebbé is teszi az alkalmazás használatát, mivel az alkalmazás egyes funkciói azonnal elérhetők a kezdőképernyőről, anélkül, hogy meg kellene nyitni az alkalmazást. Azonban a felhasználói igények figyelembevétele és a megfelelő tervezés kulcsfontosságú, mivel a túlzottan bonyolult widgetek és parancsikonok könnyen túlterhelhetik a felhasználót, és csökkenthetik az alkalmazás hatékonyságát.

Ahhoz, hogy valóban felhasználóbarát élményt nyújtsunk, a widgetek és parancsikonok megtervezésénél fontos, hogy a felhasználók számára intuitív módon legyenek elérhetők. Az alkalmazásnak egyszerű és világos beállításokat kell kínálnia, amelyek segítenek a felhasználóknak gyorsan és könnyedén testreszabni a widgeteket és parancsikonokat, így azok valóban hasznosak és kényelmesek legyenek.