Sushi – Creare la prima applicazione Android

Sushi – Creare la prima applicazione Android

E’ appena uscito il primo libro della serie Sushi dedicato alla programmazione Android. Si tratta del primo libretto di una serie che permette di condurre il lettore, passo dopo passo, alla realizzazione di applicazioni Android sempre piu’ complesse. L’approccio e’ molto pratico ed il codice disponibile su github. Sul sito ufficiale della serie sara’ inoltre possibile comunicare con il sottoscritto e gli altri lettori attraverso il seguente forum.

 

UI “Cast Away”

How it works

http://code.google.com/p/android-ui-inference/

Activity and Fragment implementation is one of the most important part of an Android Project. In these components we manage Views getting their reference with code like this:

TextView mTextView = (TextView)findViewById(R.id.my_testview);
Button mButton = (Button)findViewById(R.id.my_button);
EditText mEditText = (EditTExt)findViewById(R.id.my_edittext);

and so on. I found the usage of the (cast) operation so boring so I decided to create this super simple (but not obvious for non Java expert) utility class that eliminate that key-typing overhead.

So far the library contains only two methods. In the case we already have the reference to the root View, that we call containerView, the previous lines of code become:

TextView mTextView = UI.findViewById(rootView ,R.id.my_testview);
Button mButton = UI.findViewById(rootView ,R.id.my_button);
EditText mEditText = UI.findViewById(rootView ,R.id.my_edittext);

The code for this method uses Java generics:

@SuppressWarnings("unchecked")
public static <T extends View> T findViewById(View containerView, int viewId){
    // We find the view with the given Id
    View foundView = containerView.findViewById(viewId);
    // We return the View with the given cast
    return (T) foundView;
}

The process that permits us to do that is called Type Inference and is implemented with the

<T extends View> T

declaration. In this way the type of the returned object is inferred but the type of the variable we assign the result to.

The second method is:

public static <T extends View> T findViewById(Activity act, int viewId) {
    // We get the VuewGroup of the Activity
    View containerView = act.getWindow().getDecorView();
    return findViewById(containerView, viewId);
}

This overload just get the containerView from the Activity.

Other considerations

An alternative should be the usage of Roboguice that uses annotations to get View references with code like this:

public MyActivity extends RoboActivity{

    @InjectView(R.id.my_textview) private TextView mTextView;

    @InjectView(R.id.my_button) private Button mButton;

    @InjectView(R.id.my_edittext) private EditText mEditText;

    - - -

}

This is a good solution if you want to use Roboguice framework but your Activity should extend RoboActivity that can be a problem if you use other framework that do the same (ActionBarSherlock for instance).

Both Roboguice and my code have no compile type checking. If you write this code

TextView mTextView = UI.findViewById(rootView ,R.id.my_button);

and R.id.my_button is a Button, no compile error is generated but a runtime exception instead. By the way, the same happens when you write this code:

TextView mTextView = (TextView)findViewById(R.id.my_my_button);

or this:

@InjectView(R.id.my_button) private TextView mTextView;

Sito nuovo e… vita nuova

Come avrete potuto osservare ho deciso di azzerare completamente il vecchio sito attraverso una nuova installazione di WordPress. Questo non solo per un problema di sicurezza dovuto alla introduzione di codice JS dannoso da parte di qualcuno che non aveva altro di meglio da fare, ma per una vera e propria scelta di vita. Da ormai 4 mesi mi sono infatti trasferito a Londra dove gestisco un team di sviluppo di O2/Telefonica la cui responsabilità è quella di trasformare in prodotti alcuni prototipi che la divisione di R&D (che prendo il nome di The Lab) crea di continuo. Si tratta di un lavoro molto interessante che mi permette di rimanere sempre aggiornato sull’ultima tecnologia oltre che essere a contatto con persone di indubbia capacità. Ma perché questa decisione. Beh sembrerà strano ma sono venuto a Londra per stare di più con la mia famiglia. Fino a marzo la mia vita era un continuo viaggiare per tutta Europa per tenere corsi o per seguire progetti e fare consulenze. Nonostante il periodo di crisi, il lavoro era troppo oltre che troppo stressate per cui ho deciso di accettare l’offerta di O2 e di trasferirmi in UK. Dopo 3 mesi da pendolare tra Rovigo e Slough, finalmente la mia famiglia, finite ormai le scuole, mi raggiungerà a Wimbledon per iniziare una nuova vita insieme. Sicuramente non sarà facile ma le sfide non mi hanno mai spaventato. D’ora in poi utilizzerò questo sito per scrivere le mie considerazioni tecniche sui linguaggi e sistemi che, al momento, utilizzo maggiormente ovvero iOs ed Android, senza dimenticare ovviamente Java. Uno dei miei nuovi obiettivi sarà quello di perfezionare il mio inglese per cui d’ora in poi utilizzerò l’italiano principalmente nei miei libri o nelle mie osservazioni sulla Webzine di ApogeOnline. A parte il lavoro in O2, ora mi aspetta la scrittura del testo dedicato a Jelly Bean appena presentato alla Google I/O.  Ci sono novità molto interessanti per cui mettiamoci al lavoro….