Calcolatrice Android

Questo articolo potrebbe avere come titolo:“Introduzione allo sviluppo di app su Android”, svilupperemo infatti una semplice app allo scopo di spiegare passo passo i concetti iniziali per la sua creazione. In particolare verranno spiegati:

  • I file più importanti di Android Studio, il loro contenuto e come sono collegati tra loro
  • Il layout più semplice e comune per le activity (LinearLayout con le due orientation: vertical e horizontal)
  • Gli oggetti di uso comune (TextView, EditText, Button)
  • I metodi java per acquisire e impostare il testo da una TextView

Per leggere l’articolo si dovrebbe avere come prerequisito di base la conoscenza dei concetti principali della programmazione a oggetti (in qualsiasi linguaggio) e possibilmente aver creato almeno una volta un semplice programma java.

Contenuti:
Introduzione
Cartelle di Studio
File di Android Studio
Spiegazione
Codice


Introduzione

Implementiamo una semplicissima calcolatrice che fa la somma di due numeri.
L’ambiente usato è Android Studio.
Ogni app ha al suo interno delle Activity che non sono altro che le singole schermate che cambiano ad esempio facendo tap o facendo scorrere col dito.
Per iniziare conviene creare un’app vuota contenente una sola activity (blank activity) come in figura;


nuovo progetto con Blank Activity

così facendo, la maggior parte del codice è già scritto, bisognerà poi modificare solo le parti aggiuntive. Ricordiamoci che il nome dell’app dovrebbe sempre iniziare con la prima lettera maiuscola; in questo caso chiamiamo l’app appunto: Calcolatrice.
Può essere lasciato il package proposto che nel nostro caso è: yasb.calcolatrice. Ricordiamo per chi non lo sapesse che il package non è altro che un insieme di oggetti (descritti dalle classi) che conterrà appunto tutte le classi che creeremo.

Cartelle di Android Studio

Aprendo Studio si possono notare i componenti essenziali per lo sviluppo ovvero (come si vede in figura):


Cartelle Android Studio

  • La cartella app che a sua volta contiene le cartelle:
    • manifests
    • java
    • res

  • Gradle Scripts che contiene i file di configurazione di Gradle.
    Gradle è il Build Automation System ovvero il sistema per la creazione dell’app; lo potremmo considerare come il corrispondente su Studio di un compilatore; in realtà è molto più di questo (si veda ad esempio l’articolo: Gradle: che cos’è? sul sito Android Os Lab)

File di Android Studio

A sua volta:


FIle importanti

manifests
contiene il file AndroidManifest.xml
java
contiene tutti i file relativi alle classi java
res
contiene tutte le risorse tra cui:
layout:
contiene tutte le activity xml
values con dentro:
strings.xml
il file xml delle stringhe
dimens.xml
il file xml delle dimensioni

Spiegazione

Come si può facilmente intuire, la cartella layout contiene (principalmente) tutti i file delle schermate in formato xml; ad ogni activity deve corrispondere un file java (con un nome simile al nome del layout) che ha il compito di contenere la classe che fa partire e gestisce l’activity.
Nel nostro esempio infatti i due file si chiamano:

In realtà questi file sono stati creati in automatico scegliendo all’inizio la blank activity.
Il file AndroidManifest.xml contiene un riferimento a tutte le activity presenti nell’app; dice inoltre quale activity parte inizialmente oppure, ad esempio, quale activity parte se l’app viene chiamata da un’altra app del dispositivo.
Il file strings.xml serve solo come riferimento per le stringhe inserite nelle activity che possono essere scritte una volta ed usate in più schermate; inoltre potranno essere successivamente tradotte in qualsiasi lingua senza la necessità di modificare il codice interno alle activity.
Il file dimens.xml invece serve come riferimento per dimensioni varie (size del testo, distanze tra i vari oggetti ecc.); anche qui l’uso corretto di questo file permette, modificando una sola dimensione di avere come risultato la modifica delle dimensioni di tutte le activity.

Codice

Ecco quindi di seguito i file con alla fine di ognuno la spiegazione:
AndroidManifest.xml
activity_main.xml
strings.xml
dimens.xml
MainAcitvity.java


AndroidManifest.xml




 
    
      
        
        
      
    
  

Il file Manifest qui presente è stato creato in automatico all’atto della creazione dell’app con una Blank Activity.
In generale il Manifest contiene l’elenco di tutte le activity presenti all’interno dell’app; queste devono essere inserite tramite il tag: activity; l’opzione

android:name

serve ad indicare dopo il punto il nome del file java (senza estensione) che fa partire l’activity (infatti il nostro file java si chiama: MainActivity.java).
Quindi, per capire, se io volessi inserire un’altra activity dovrei creare prima un file xml (ad esempio: seconda_activity.xml) nella cartella res/layout, poi il corrispondente file java (ad esempio: Seconda.java) nella cartella java; successivamente nel Manifest basterà aggiungere (dopo </activity>):

    
    

Come si vede non è stata inserita la parte relativa all’intent-filter presente sopra; questo perchè l’intent filter si mette solo nelle activity che hanno un comportamento particolare.
Nel nostro file AndroidManifest.xml infatti, l’intent-filter all’interno della MainActivity indica che questa è l’activity di default che parte all’avvio dell’app.


activity_main.xml



    

    
    

    

        
        

        
    

Questo file come detto contiene la parte grafica in xml dell’activity; si tratta di inserire dei widget (oggetti) all’interno di un layout grafico.
I widget presenti sono:

  • TextView: ovvero le etichette
  • EditView: ovvero le caselle di input
  • Button: pulsante
  • Il LinearLayout permette di posizionare i widget in due diversi modi:

    android:orientation=”vertical”
    permette di posizionare i widget uno sotto l’altro
    android:orientation=”horizontal”
    permette di posizionare i widget uno accanto all’altro

    Da notare:

    • android:id serve ad assegnare un identificativo all’oggetto per un futuro riferimento all’interno nel codice java
    • android:onclick all’interno del Button, serve ad indicare il nome della funzione da chiamare quando il pulsante viene premuto; la funzione deve essere scritta nella classe java corrispondente all’activity (nel nostro caso: MainActivity.java)

    L’activity comparirà come in figura:


    Layout Calcolatrice

    inoltre:
    • android:hint mostra un suggerimento (nel nostro caso: “inserisci numero”) che scompare quando l’utente clicca sulla casella per inserire il numero
    • android:text mostra invece il testo di un qualunque oggetto (come ad esempio “Calcola” sul Button) che a differenza dell’hint non scompare
    • android:PaddingTop è la distanza dall’oggetto che sta sopra (Top) che è inserita tramite un riferimento nel file dimens.xml;


    strings.xml


    Calcolatrice
    Calcolatrice!
    Impostazioni


dimens.xml


    
    16dp
    16dp
    40dip
    30dip
    50dip
    20dip

Come si può notare, sono state impostate tre distanze:

  • paddingTopNextTitle: distanza di un oggetto dal titolo
  • paddingTopNextWidget: distanza di un oggetto dall’oggetto superiore
  • paddingTopNextFrame: di un oggetto dal “blocco” superiore
  • paddingLeftNextTitle: di un oggetto da quello accanto (per il LinearLayout con orientation horizontal)


MainActivity.java

package yasb.calcolatrice;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    private Button btnCalcola;
    private EditText number1;
    private EditText number2;
    private TextView txtResult;//TextView del risultato inizialmente a zero

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

        btnCalcola = (Button) findViewById(R.id.btnCalcola);
        txtResult = (TextView)findViewById(R.id.result);
        number1 = (EditText)findViewById(R.id.numero1);
        number2 = (EditText)findViewById(R.id.numero2);
    }

    public void calcola(View v)
    {
        String strNum1 = number1.getText().toString();
        String strNum2 = number2.getText().toString();
        int n1 = Integer.parseInt(strNum1);
        int n2 = Integer.parseInt(strNum2);
        int res = n1 + n2 ;
        String strStr = String.valueOf(res);
        txtResult.setText(strStr);
    }

//il codice sottostante viene creato in automatico scegliendo Blank Activity
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Bè, il package come detto è un insiemi di classi, il codice

package yasb.calcolatrice;

sta ad indicare che la classe sottostante appartiene (viene aggiunta) al package yasb.calcolatrice.
Gli import servono ad includere (proprio come la direttiva #include del C/C++) le classi che sono usate nel codice (Studio vi aiuta a importare le classsi che scrivete nel codice chiedendovi semplicemente di premere ALT+INVIO).
La classe MainActivity (il nome della classe deve avere lo stesso nome del file come usuale in java) estende (cioè è una sottoclasse di) da ActionBarActivity. Per semplicità potrebbe estendere semplicemente dalla classe Activity.
La funzione onCreate parte in automatico quando viene creato l’oggetto MainActivity.
L’onCreate imposta il layout grafico tramite la funzione: setContentView a cui bisogna passare il nome del layout, nel nostro caso activity_main (senza .xml).
Inoltre nella onCreate vengono inizializzate le variabili degli oggetti grafici che serviranno per il calcolo della somma.
L’inizializzazione viene effettuata tramite la funzione findViewById che vuole come parametro l’id dell’oggetto (prelevato tramite R.id.idoggetto) e restituisce una View (un oggetto di tipo View) che deve essere trasformata (tramite casting) nell’oggetto relativo.
Per intenderci, i vari TextView, EditText, Button, ma anche i Layout ecc. sono delle sottoclassi della classe View; la findViewById restituisce una View generica che deve essere trasformata nell’oggetto reale corrispondente.
La funzione calcola viene chiamata quando viene premuto il Button Calcola (vedi android:onClick nel Button), e fa nell’ordine:

  • preleva i valori delle EditText
  • li trasforma in numeri interi
  • fa la somma
  • inserisce il risultato nella TextView relativa

In realtà la variabile “btnCalcola” che contiene il Button non viene mai usata e quindi in questo codice si potrebbe anche evitare di inserire.
In generale potrebbe invece essere utile lasciarla e questo in particolare quando al posto dell’onClick dentro l’oggetto Button, si volesse usare il cosiddetto Listener (inserito direttamente nel codice java).