MojAndroid

Aj napriek tomu, že Android ponúka vývojárom široké spektrum prvkov a možností kustomizácie používateľského rozhrania, niekedy to jednoducho nestačí a programátor si musí dopomôcť sám implementáciou vlastných komponentov, zahŕňajúc ich funkčnú logiku i vzhľad.

S touto skúsenosťou som sa ako Android programátor stretol už niekoĺko krát a rozhodol som sa svoje poznatky poskytnúť aj vám, nádejným vývojárom. Rovnako budem rád, keď sa aj ja dozviem niečo nové od vás a možno pár mojich riešení spolu s vašimi nápadmi zdokonalíme. Moje tutoriály budú predpokladať znalosť základov vývoja aplikácii pre našu obľúbenú platformu, nakoľko ich cieľom nie je učiť, resp. opakovať to čo by ste už mali vedieť. Na tomto portály som čítal pár článkov pre začínajúcich Android vývojárov, preto ak ešte máte nejake medzery, odporúčam prečítať si ich.

Prvým z tutoriálov bude niečo jednoduchšie, a to tvorba komponentov s vlastným definovaným atribútom, typom písma. Je síce pravdou, že napríklad trieda TextView v Android SDK má zadefinovanú metódu setTypeface(Typeface), ktorá určuje typ zobrazovaného písma v komponente, no povolenými hodnotami pre korešpondujúci XML atribút android:typeface sú len normal, sans, serif a monospace, teda nepovoľuje priamo nastaviť vlastný typ písma, priložený v projekte. Jedným z riešení je nastaviť ho explicitne v zdrojovom kóde aplikácie:

TextView tv_title = (TextView) findViewById(R.id.tv_title);
Typeface font = Typeface.createFromAsset(getAssets(), "Continuum.ttf");
tv_title.setTypeface(font);

Pri veľkom počte prvkov s požadovanou vlastnosťou je to však neefektívne a vhodnejšie je zadeklarovať nový XML atribút vlastného objektu s rovnakými vlastnosťami.

Deklarácia nového atribútu v súbore attrs.xml vyzerá nasledovne:

<declare-styleable name="CustomFont">
<attr name="font" format="string" />
</declare-styleable>

kde CustomFont je kontajner pre deklarované atribúty, font je názov atribútu a string požadovaný formát vstupných hodnôt.

V novej triede TextViewCustom dediacej od rodičovskej triedy TextView je potrebné vytvoriť konštruktory a nové metódy:

Metóda, ktorá načíta hodnotu nového atribútu z XML súboru:

private void setFont(Context ctx, AttributeSet attrs) {
TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.CustomFont);
String customFont = a.getString(R.styleable.CustomFont_font);
setFont(ctx, customFont);
a.recycle();
}

Metóda, ktorá nastaví požadovaný typ písma pre objekt, v prípade že existuje (písmo je priložené v assets/ adresári a názov súboru je rovnaký ako hodnota atribútu):

public boolean setFont(Context ctx, String asset) {
Typeface tf = null;
try {
tf = Typeface.createFromAsset(ctx.getAssets(), asset);
} catch (Exception e) {
Log.e(TAG, "Could not get typeface: " + e.getMessage());
return false;
}
setTypeface(tf);
return true;
}

XML súbor s použitím vlastného objektu potom môže vyzerať takto:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tutorial="http://schemas.android.com/apk/res/sk.telepovsky.android.tutorials"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<sk.telepovsky.android.tutorials.components.TextViewCustom
android:layout_width="match_parent"
android:layout_height="wrap_content"
tutorial:font="Continuum.ttf"
android:text="@string/poll_information"
/>
</LinearLayout>

Za povšimnutie stojí pridanie nového namespace-u (tutorial) pre novo vytvorený atribút a absolútna cesta pri deklarácii vlastného komponentu (sk.telepovsky.android.tutorials.components.TextViewCustom).

Úplne rovnakým spôsobom boli vytvorené vlastné triedy ButtonCustom a EditTextCustom. Ich použitie je analogické. Celkový výsledok môžete vidieť na nasledujúcom screenshote:

V prílohe TutorialCustomFont.zip sa nachádza Android projekt so všetkými zdrojovými kódmi, ktoré pre funkcionalitu zahrnutú v tomto článku potrebujete. Dúfam, že sa vám môj prvý tutoriál páčil a v prípade záujmu by sme sa nabudúce mohli pozrieť na niečo zložitejšie.

8.4.2012

Pravidlá diskusie

Portál MojAndroid.sk si vyhradzuje právo zmazať neslušné, rasistické a vulgárne príspevky, ako aj osobné útoky na redakciu, či diskutérov v komentároch pod článkom bez ďalšieho upozornenia. V prípade uverejňovania odkazov na externé stránky, je komentár automaticky preposlaný do redakcie na schválenie.

+