Capitolo 2 Refactoring

Github: https://github.com/massimocarli/new_ugho_application    on branch: capitolo2

Iniziamo quindi con la creazione del progetto UGHO selezionando la corrispondenza opzione nel menu File di Android Studio. Rispetto a quanto descritto nel libro ora AS ci permette di aggiungere automaticamente al progetto delle librerie aggiuntive inserendo la corrispondente definizione del file di configurazione di Gradle. Nel nostro caso (Figura 2.1) non utilizziamo questa feature utilizzando solamente il wizard per la creazione della icona e quello per la creazione della Activity principale. Notiamo poi come la versione minima di Android per la nostra applicazione sia Gingerbread ovvero la 2.3.3.

Screen Shot 2013-12-11 at 09.59.46

Figura 2.1 – Nuova Form di creazione di un Progetto con AS 0.3.7

A questo punto proseguiamo con le varie schermate attraverso la selezione del pulsante next come descritto nel testo. Una importante modifica rispetto a quanto riportato nel libro riguarda la schermata in Figura 2.2 equivalente alla figura 2.5 del testo.

Screen Shot 2013-12-11 at 10.03.49

Figura 2.2 – Creazione della Activity Principale

Qui infatti compare un nuovo campo relativo al nome del layout del Fragment che l’Activity andrà ad utilizzare. Quello di Fragment e’ un concetto molto importante che nel libro viene affrontato nel capitolo 3. Ora siamo costretti ad anticiparlo. Niente paura, vedremo quello che serve riservandoci di approfondire poi le cose più’ avanti.

Nota: Alla prima visualizzazione della preview il tool mi ha visualizzato un errore dovuto alla mancanza di un tema. E’ stato comunque sufficiente fare un refresh (passando ad altro file e tornando indietro) per risolvere automaticamente il problema.

Una volta confermata la creazione del progetto tutto quanto creato e’ analogo a quanto riportato nel testo. La struttura dei file che ottengo e’ praticamente la stessa. Degno di nota e’ invece il nuovo file di configurazione Gradle che ovviamente utilizza librerie e versioni successive a quelle del libro. Nello specifico quella da me ottenuta e’ la seguente:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 19
    }
    buildTypes {
        release {
            runProguard false
            proguardFile getDefaultProguardFile('proguard-android.txt')
        }
    }
    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
}

Come detto, a parte alcune versioni delle librerie utilizzate, notiamo la presenza delle configurazioni relative a Proguard ovvero al tool che permette allo stesso tempo di offuscare il codice (renderlo non leggibile dopo eventuale decompilazione) e di eliminare codice inutile come potrebbe essere quello relativo ai messaggi di Log nella versione di produzione della nostra applicazione.

Un’altra differenza che noto rispetto a quanto riportato nel testo e’ la mancanza di alcuni qualificatori nella definizione delle risorse. Mancano infatti le seguenti cartelle:

/res/values-v11
/res/values-v14

mentre quelle relative alle dimensioni del display sono state sostituita da una sola. A tale proposito e’ sufficiente leggere quanto riportato nella parte di descrizione delle risorse nel testo.

Quanto detto prima relativamente all’utilizzo dei Fragment ha portato alla generazione di due file di layout a differenza di quanto avvenuto con la versione relativa al testo. Si tratta di un layout per l’Activity ed uno per il Fragment che la stessa contiene. In particolare quello relativo alla Activity e’ il seguente:

<FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:id=”@+id/container”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”uk.co.massimocarli.android.ugho.MainActivity”
tools:ignore=”MergeRootFrame” />

mentre quello del Fragment contenuto in essa e’ il seguente:

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:paddingLeft=”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
android:paddingBottom=”@dimen/activity_vertical_margin”
tools:context=”uk.co.massimocarli.android.ugho.MainActivity$PlaceholderFragment”>

<TextView
android:text=”@string/hello_world”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />

</RelativeLayout>

Si tratta di layout che hanno la sola particolarità di contenere alcuni elementi relativi al namespace tools. Si tratta di informazioni che vengono utilizzate da Android Studio per capire come renderizzare le preview. Ad esempio, gli attributi android:context permettono di specificare quello che e’ il componente corrispondente in modo da prendere le eventuali configurazioni relative al tema utilizzato all’interno del file di configurazione AndroidManifest.xml.

L’utilizzo dei Fragment porta anche ad una modifica del codice sorgente della Activity creata in modo automatico la quale e’ la seguente:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}

Per capire bene che cosa sia un Fragment rimandiamo al relativo capitolo del testo. Per il momento qui possiamo notare come ne venga definito uno attraverso la classe statica interna di nome PlaceholderFragment e di come questa venga associata all’attività che la contiene nel metodo onCreate() attraverso quello che vedremo essere il FragmentManager.

Quanto descritto nel resto del capitolo va bene anche per questa versione di AS.

Come ottenere il progetto da GitHub

Il primo passo consiste nell’eseguire il comando di clone

git clone git@github.com:massimocarli/new_ugho_application.git

Il quale crea il folder

/new_ugho_application

Per verificare il branch corrente e’ sufficiente eseguire il comando

git branch

In questo caso dovrebbe essere il branch capitolo2. Nel caso non fosse cosi’ e’ sufficiente eseguire il comando

git checkout capitolo2

A questo punto il progetto e’ presente nel vostro file system ed e’ pronto per essere importato da Android Studio. Per fare questo si utilizza l’opzione

File > Import Project

e quindi selezionare la cartella del progetto che in questo caso e’ new_ugho_application e confermare i settings di default. A questo punto il progetto e’ importato in AS.

Per non interferire con le prossime aggiunte del progetto e’ consigliabile che il lettora lavori in un proprio branch.

 

2 thoughts on “Capitolo 2 Refactoring

  1. Ciao complimenti per il libro Android 4. Ho un problema con git. Mi dice che non posso eseguire il comando clone per via della public key

Leave a Reply

Your email address will not be published. Required fields are marked *