DevCorner: Java, annotazioni e "coltelli da burro"

Roberto Orgiu
Roberto Orgiu
DevCorner: Java, annotazioni e "coltelli da burro"

Il titolo di questo DevCorner è senz'altro provocatorio e non privo di doppi sensi: il framework che andremo a scoprire si chiama infatti Butter Knife ed è basato sulle annotazioni implementate nel linguaggio Java. Ma facciamo un piccolo passo indietro per meglio focalizzarci sull'obbiettivo.

Abbiamo sicuramente notato la stringa @Override campeggiante sopra il metodo OnCreate nella stesura di software Android: quelle lettere accompagnate dalla chiocciola costituiscono un'annotazione, ovvero un metadato che il compilatore andrà a valutare e, in caso di esito negativo (il metodo che abbiamo specificato non fa l'override correttamente), ci restituirebbe un errore di compilazione.

Introdotto questo concetto, andiamo ad esplorare il prodotto di Jake Wharton, che si basa su questo concetto: tramite delle custom annotation, Butter Knife ci permetterà di associare delle variabili con gli id dichiarati nel layout (rimpiazzando la chiamata a findViewById), specificare quali metodi richiamare per gli eventi di OnClick, OnCheckedChange e per azioni specifiche inerenti liste ed elementi.

Per implementare questa libreria abbiamo 3 diverse strade: Gradle, Maven e il classico metodo di inclusione dell'archivio JAR. Noi, basandoci sul paradigma dettato da Android Studio, abbiamo scelto di seguire la prima via, che si è anche rivelata la più semplice da implementare. Apriamo quindi il file build.gradle relativo al modulo della nostra app e, nella sezione dependancies, incolliamo la seguente riga, come mostrato alla riga 23 del file sorgente.

compile 'com.jakewharton:butterknife:4.0.1'

Una volta inserita questa riga, dovremo sincronizzare la copia di Gradle tramite l'apposito bottone situato all'estrema sinistra della toolbar riservata agli strumenti dell'Android SDK.

GradleSync

A questo punto, il nostro progetto è configurato per utilizzare Butter Knife e possiamo iniziare a vedere come rimpiazzare l'ubiquo findViewById: dichiariamo, ad esempio, una TextView come variabile a livello di classe (omettendo il modificatore di accesso, altrimenti verremo avvisati di anomalie nella dichiarazione) e affiancandola all'annotation che andrà ad associarla con l'id relativo:

@InjectView(R.id.txtView) TextView txtView;

Passiamo ora ad associare un bottone con il proprio evento OnClick, nel quale vedremo quanto tempo potremo risparmiare utilizzando questa libreria:

@OnClick(R.id.btnCambia) void cambiaTesto(){
txtView.setText("Hello from ButterKnife");
}

Utilizzando l'annotation di Butter Knife, non avremo bisogno di dichiarare OnClickListener né nel codice, né nel layout XML, ma la routine verrà generata durante la compilazione del codice sorgente.

L'ultimo passo che dovremo effettuare per essere sicuro che tutto funzioni a dovere è l'inizializzazione del motore del framework, che inseriremo nel metodo OnCreate dell'Activity in cui decidiamo di usare ButterKnife (potete trovare qui il listato completo dell'Activity):

ButterKnife.inject(this);

Ora non ci resta che compilare il progetto e vedere che tutto funzioni come sperato!

Se volete dare uno sguardo ai sorgenti completi del nostro progetto, fate un salto sul thread del nostro forum mentre, se volete saperne di più su Butter Knife, potete leggere le pagine del sito ufficiale e della documentazione.