Ricordando il vecchio Android

Suonerà strano ,ma android si e’ evoluto in questi sette anni,ha fatto passi da
gigante e presto abbandonerà il vecchi java? Ma..!? speriamo più tardi che mai.
E allora aspettando in cosa si trasformerà percorriamo insieme cosa e’ stato.

Cosa c’è in un applicazione android?

Activity Manager e Fragment Manager

controllano il ciclo di vita dell’applicazione
dalla sua creazione (onCreate ) alla sua morte (onDestroy)

-Views si occupa della parte grafica tutto quello che vediamo o non vediamo nell’applicazione
fa parte delle Views

Notification Manager

Tutto ciò che compare nella prima riga del telefono
quelle piccolissime icone e avvisi è gestito da Notification Manager

Content Providers

android mette a disposizione dei dati per tutte le applicazioni
sono dei dati organizzati in tabelle che e’ possibile interrogare modificare o cancellare.
come ad esempio i contatti telefonici.Questa parte è molto interessante perché vedremo come
è possibile crearne altri personali.

Resource Manager

Questa parte gestisce alcune informazioni come stringhe,frasi,colori
ecc.

Intents

Questa parte si occupa di trasferire dati tra applicazioni diverse ,possiamo paragonarli a dei programmi che il sistema mette a disposizione dello sviluppatore facilitando
molto il lavoro dello sviluppatore.

Android Libraries

le librerie android ,raccolta di programmi per facilitare il compito dello sviluppatore SI RIMANDA ALLA DOCUMENTAZIONE UFFICIALE

Installiamo Android

Installiamo android,e Java Development Kit (JDK) da Oracle
SDK DI ANDROID
i suoi sorgenti si trovano a:SORGENTI SDK ANDROID ma
sinceramente non ho mai provato a scaricarli.
Per sviluppare android possiamo scegliere Android Studio ,intalliamolo e..

Raccomandazioni !

Una raccomandazione per anni ho cercato di installare android su eclipse ,ma non ci sono mai riuscito(avevo un netbook con 2 giga di RAM).Solo adesso ho scoperto che il problema era avere un PC performante ,per iniziare va bene un processore i5 con 8 giga di RAM,meglio un i7 anche
comprato usato di qualche anno.Ho visto che gli sviluppatore affermati usano IMAC Apple Beati
Loro!

piccolo consiglio

come ho imparato a fare dei piccoli programmi.
C’e’ chi il programma l’ha già tutto in testa(Beato lui!!)
Io invece procedo per tentativi,(infatti ho deciso di chiamarmi
unultimaprova) in basic mi era semplice ,bastava che mettessi
delle msgbox messaggi che mi visualizzavano il contenuto delle variabili.In android ciò non avrebbe senso perchè il flusso
del programma non viene arrestato dal messaggio e non è possibile
fotografare il contenuto delle variabili.Esiste però la possibilità di inserire dei Log.d(context,variabiledaispezionare)
che permettono di visualizzare nella console il contenuto delle
variabili.

Apriamo Android Studio clicchiamo su File scegliamo nuovo proggetto diamo un nome al progetto la prima lettera deve essere maiuscola,scegliamo basic activity
attacchiamo il nostro cellulare android ,abilitiamo l’usb Debug del cellulare,clicchiamo il tasto verde a forma di freccia
e aspettiamo..fatto abbiamo creato la nostra prima app android.
Ma questo e’ solo l’inizio…
Andiamo in onCreate cancelliamo tutto tranne il super e prepariamo la nostra tovaglia
su cui poi porre i nostri oggetti.
questa e’ la nostra tovaglia:
LinearLayout.LayoutParams linearp;
linearp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);

E’ una riga che occupa tutto lo spazio del video.
Creiamo ora un altra riga con lo sfondo rosso:
LinearLayout linearv = new LinearLayout(this);
linearv.setOrientation(LinearLayout.VERTICAL);
linearv.setBackgroundColor(getResources().getColor(R.color.colorAccent));

creiamo ora una riga di testo e scriviamoci “Ciao”:
TextView tv_testo =new TextView(this);
tv_testo.setText(“Ciao”);

inseriamo questa casella di testo nella riga precedente:
linearv.addView(tv_testo);
e ora facciamo la magia e facciamo comparire tutto a video con il comando:

this.addContentView(linearv, linearp);
Spostiamo la scritta a centro e aumentiamo la dimensione del carattere
tv_testo.setGravity(1);
tv_testo.setTextSize(26);

Qui il codice

Quando abbiamo cancellato tutto nell’esempio ,c’era un istruzione
setContentView(R.layout.activity_main);Questa istruzione visualizza un intero file
activity_main.xml su video,in questo file vi sono istruzioni che servono ad android
per visualizzare i vari oggetti a video.

Il lettore prenda queste informazioni cosi come sono,facendo finta di fare una lettura leggera approfondiremo il tutto piano piano, con un po di tempo e pazienza,rimetteremo mano a tutte le pagine e articoli ,così la nebbia sparirà e vedremo un cielo più limpido.Alla fine del lavoro (forse tra un anno) vi svelerò un SEGRETO..

Tutto scorre ,Eraclito

Quando ho fatto qualche piccola applicazione in android mi sono imbattuto in una cosa molto strana,parte di codice non veniva eseguito pur non essendoci errori ,altre volte veniva eseguito in parte.Veniva sacrificata quasi sempre la parte di codice che che impiegava più
tempo.
Per android è imperativo che non devono esserci tempi di attesa molto lunghi.A differenza
dei programmi per PC dove alla visualizzazione di una messageBox posso far fermare l’esecuzione
di un programma ,non posso farlo per android.
L’applicazioni android possono essere in:

Foreground

Vengono visualizzate a video

Background

lavorano ma non Vengono visualizzate a video

Intermittent

Lavorano in maniera alternata

Widget

Sono visualizzate a video ma lavorano in background

Parliamo del file Manifest.xml

Il primo file di un progetto android studio .E’ un file molto importante,detta le regole geenerali dell’applicazione ,una sua istruzione molto interessante é:

uses-feature android:name=”android.hardware.Location”
Questa sopra ne è solo un esempio indica che l’applicazione sopra può essere installata
solo su telefoni che hanno il GPS.
Questo impedisce di installare l’applicazione su telefoni che ne sono sprovvisti.
Altro hardware:
Audio
Bluetooth
Camera
Microphone
NFC
Sensors
Telephony
Touchscreen
USB
Wi-Fi

possiamo inoltre fissare la grandezza dello schermo con il comando:

alcune funzioni richiedono il consenso dell’utente e quindi occorre specificare i permessi.
In poche parole bisogna chiedere il permesso per poter usare alcune risorse.

Costruiamo una prima lista
Aggiungiamo alla listview un login con password

Struttura di un file Manifest di Android


–>

Questo e’ il primo file componente di Android che definisce tutte le direttive principali dell’applicazione ad esempio android;installLocation:preferExternal vuol dire
che e’ l’applicazione verrà installata su memoria esterna se esiste.
potrà indicare che l’applicazione verrà installata solo su telefoni che
hanno una camera ecc.

Res Values

Nella nostra prima applicazione nella colonna di sinistra vediamo una cartella res,in questa
cartella sono memorizzati tutti i dati necessari all’applicazione .
Come ad esempio il file string.xml,in questo file sono memorizzati stringhe ma anche array di
stringhe.Il contenuto del file tipo:

Ciao!

Da programma il valore della stringa di nome hello verrà restituito dal comando
String saluto=getString(R.string.hello);
C’è poi un file color.xml ,in questo file noi possiamo personalizzare i nostri colori
a piacimento:

#374566

 

C’è un file per le dimensioni dimensio.xml,un file per le immagini drawable.xml e infine
un file per i vari stili che possiamo paersonalizzare a piacimento raggruppando
i dati dei file precedenti creando cosi un nostro stile personale che possiamo dare alla
nostra applicazione.
Insomma un file per tutto!Tra questi uno molto interessante si trova in res/animator/
Questa e’ la sua sintassi:

I vari stati di un activity

un activity è la parte grafica di un app android
con questo snippet possiamo vedere i vari stati.Se fate eseguire questo snippet noterete
che nel passaggio da un activity a un altra non viene eseguito il metodo onDestroy ,che verrà
eseguito solo quando l’activity verra’ distrutta definitivamente.
ActivityChange

Layout di Android Studio

Apriamo android studio scegliamo nuovo progetto da menu file chiamiamolo MysnippetLayout scegliamo empty activity (la più semplice)
nella colonna di sinistra notiamo una cartella layout
in questa cartella ci sono dei file xml apriamoli dentro è codificato
la parte grafica che verrà visualizzato sullo smartphone con il magico comando
setContentView().
Posizionamoci sulla directory layout creiamo un nuovo file xml di nome riga1.xml.
in basso e’ possibile vedere questo file in modo grafico (design) o testo (text).
Clicchiamo modo testo e cambiamo la voce vertical in horizzontal.
Dalla colonna “palette” scegliamoci i widget botton e trasciniamoli dentro la nuova finestra con dragAndDrop.
Se attacchiamo il telefono in modo debug ,premiamo la freccetta
verde non vedremo i tre bottoni,questo perché dobbiamo dire all’applicazione di
visualizzarli, lo faremo utilizzando il metodo inflate con il seguente comando:

Infiliamo la finestra grafica riga1 nella finestra principale.Attualmente con il recente android studio potremo trovare in activity_main.xml ConstraintLayout invece
di RelativeLayout ,basta sostituire il secondo al primo.
Ricompiliamo e vedremo i tre bottoni,ma i tre bottoni sono tutti e tre senza spazio e
tutti a sinistra inseriamo in activity_main il comando android:gravity=”center|top”.
Noterete che per la prima volta non abbiamo usato il prefisso layout_,perché?
Perché i comandi layout_ sono riferiti ai componenti che contengono la finestra.
Noterete che i tre bottoni coprono la textView di activity_main.xml.Risolviamo il
problema inserendo un layout vertical co id= R.id.activity_main_linear in activity_main.xml.Noterete inoltre che ho commentato l’istruzione RelativeLayout ….
perché adesso io inflate in LinearLayout .

i tre bottoni con inflate
I bottoni toccano lo schermo ,vogliamo un po staccarli .Andiamo a inserire in
activity_main il comando android:padding=”10dp”
Creiamo riga2.xml come abbiamo fatto con riga1.xml,cambiamo l’orientamento da vertical a horizontal trasciniamo dentro un editText e un bottone.Molto probabilmente
non si vedrà il bottone o il plaintext allora aggiungiamo in modalità testo
il comando android:layout_weight=”1″ che ripartirà le lunghezze in parti uguali.
Ma siccome vogliamo il bottone più piccolo del testo da inserire ripartiamo l’ 1
in 0.3 e 0.7.
Con la tecnica inflate ,infiliamo la seconda riga in activity_main.xml

Lo snippet

 

Esiste un metodo più semplice

Eppure esiste un metodo più semplice per infilare una riga dentro l’altra,si chiama
include .
Creiamo una terza riga3.xml con il solito metodo e mettiamoci con il drag and drop
una checkBox.Andiamo in activity_main e includiamola.
Scarica lo snippet

Mettiamo un ascoltatore:I Listener

Vanno bene i bottoni ,la checkbox, ma come possiamo usarli,come possiamo interagire
con essi?
Ci servirebbe un qualcosa che stesse in ascolto ad ogni click che facciamo:I Listener
tra i più antichi è questo:implements View.OnClickListener e il suo metodo : public void onClick(View view).Ma non funziona ,non riesce a intercettare i bottoni.
E allora proviamo a indirizzarli con i seguenti comandi:
View bottone =(View)findViewById(R.id.button);
View bottone2 =(View)findViewById(R.id.button2);
e agganciarli con i seguenti comandi:
bottone.setOnClickListener(this);
bottone2.setOnClickListener(this);

LAYOUTS

LA grafica di android era gestita da java nel codice ,ma può
essere anche gestita da codice xml
Creiamo una seconda activity e chiamamola Main2Activity con il
comando setviewcontent scegliamo come layout linearsecondaactivity
qui come potete vedere abbiamo usato un invece di inflate.
cosi abbiamo:
-1 FRAMELAYOUT
-2 LINEARLAYOUT
-3 GRIDLAYOUT
-4 RELATIVELAYOUT
Il primo è un contenitore che ha la caratteristica di centrare
tutti i componenti grafici interni.
Il secondo ha la capacità di allineare orizzontalmente o verticalmente i componenti grafici che li contiene
Il 3 layout GRidlayout crea una rete di righe e colonne
in cui intrappola i contenuti grafici
Il 4 layout come dice stesso la parola contiene gli elementi
grafici posizionandoli con riferimenti relativi agli elementi
stessi.

I Widget

Ma cosa sono questi elementi grafici? Gli elementi grafici
elementari con cui si forma la grafica delle nostre app,si chiamano Widget.
Alcuni li abbiamo già incontrati.
La textview detta anche etichetta contiene un testo.
button è un bottone

I FRAGMENT COSA SONO?

Mi sono sempre chiesto a cosa servono i fragment se ci sono
le activity.I fragment a differenze delle activity non sono legati
direttamente alla parte grafica dell’applicazione.Questo offre un grande vantaggio.Quale?
Il sistema android fatica molto nel tenere sempre aggiornata la parte grafica dell’app,se noi inseriamo nella nostra applicazione
dei calcoli abbastanza complessi rischiamo di rallentare l’applicazione ,inoltre questi calcoli possono essere influenzati ,
dalla ricostruzione grafica dell’activity.Il Fragment è indipendente dalle variazioni che possono avvenire sull’activity e comunica con essa con dei meccanismi ben precisi.
E’ anche vero che il fragment ha una sua grafica e come l’activity ha vari stati .
Si può pensare ad esso come una miniactivity.
Di solito si usano quando gli schermi sono abbastanza grandi.
Creiamo il nostro primo fragment ,con il tasto destro del mouse sul nostro pacchetto scegliamo new fragmentblank senza
layout.
Facciamo partire l’applicazione ,ma non vedremo niente.
Questo perchè dobbiamo dire ad android di caricare il
fragment.
Questo comando possiamo darlo in due modi:ci creiamo
una risorsa layout con un id (sempre con il tasto dx del
mouse al menu file) ,poi inseriamo un riferimento
al fragment nel layout della schermata iniziale.
non ci credete? Scaricate lo snippet e provate.
primo metodo per caricare il fragment
Quello che abbiamo visto è un metodo abbastanza semplice,
perchè il fragment è automaticamente caricato a patto però
di scrivere un tag ,un istruzione ben precisa nel file “schermatainiziale.xml”.
Questo metodo anche se semplice sembra però statico,non ci dà
la possibilità di crearcene uno a runtime.
il secondo metodo è un po più articolato,ma offre nuove possibilità futura :attacco e sgancio di quanti fragment vogliamo .
Andiamo a vedere che istruzioni dobbiamo usare.
Prima di tutto dobbiamo crearci dei contenitori grafici
con un id di riferimento.Allora creiamo una risorsa layout
orientata verticalmente e dentro inseriamo due Framelayout.
poi con le classi fragmetmanager e fragment transition
addizioniamo rimuoviamo e sostituiamo,nascondiamo i vari fragment di un activity.
Snippet add fragment

Ma come il Fragment comunica con l’activity?
Dall’activity al Fragment è abbastanza facile,basta individuare la risorsa con id e attaccare ad essa un listner.
Dall’Fragment all activity la cosa è un po piu complessa,
bisogna implementare una interfaccia listener che verrà sviluppata
nell’activity.
Quello che vogliamo fare ora è capire a cosa servono i fragment con un esempio pratico.
Supponiamo di avere una lista di oggetti da visualizzare,la cosa più semplice è passare da un activity a un altra.Ma supponiamo di avere abbastanza spazio da poter visualizzare
due pagine sul display.Poichè non si possono visualizzare
due activity contamporaneamente(fino ad android 6) ,ecco che allora ci serviamo di un fragment dove all’interno visualizzeremo la lista.
Mettiamoci subito in ‘opera:
Il grosso del lavoro c’e’ lo fa android studio,che ci mette
a disposizione un activity master/detail flow e il suo codice
esguiamola su due emulatori diversi,uno smartphone e un tablet ,e notiamo che nel telefono la seconda colonna non
compare,mentre nel tablet che ha più spazio si.
Ma come fa l’activity a capire su quale dispositivo sta girando?
Il segreto sta nel fatto che adesso la classe main ha esteso
FragmentActivity questa classe e’ in grado di capire se l’activity sta girando su un display più grande e automaticamente seleziona layout-sw600.
Partendo da questa certezza possiamo interrogare se esiste
una finestra che esiste solo nel layout-sw600 ,così siamo sicuri di essere in un tablet.
A questo punto invece di caricare una seconda activity che a sua volta chiamera’ il fragment,carichiamo direttamente il fragment che ci visualizzera’ la seconda lista nella stessa pagina.
Analizzando il file manifest notiamo che l’activity di partenza è newslistactivity (launcher) ma questa activity di per se non crea nessuna lista di item.Chi crea allora questa lista di item? Come abbiamo gia’ detto in precedenza un fragment può essere caricato anche tramite file layout xml.
Infatti nel metodo onCreate di newlistactivity viene visualizzato il layout activity_news_list facciamo tana
al fragment newslistfragment.
Quello che invece pare incomprensibile è un ovveride(riscrittura) di un metodo :onItemSelected(String id) che dovrebbe esistere in teoria nella classe FragmentActivity Ma questo metodo non esiste in FragmenActivity e allora da dove salta fuori? Questo metodo e’ un interfaccia implementata
in newslistfragment
public interface Callbacks {
/**
* Callback for when an item has been selected.
*/
public void onItemSelected(String id);
}

/**
* A dummy implementation of the {@link Callbacks} interface that does
* nothing. Used only when this fragment is not attached to an activity.
*/
private static Callbacks sDummyCallbacks = new Callbacks() {
@Override
public void onItemSelected(String id) {
}
};
ed e’ implementata in newslistactivity.
L’interfaccia e’ la tecnica con cui il fragment comunica con
l’activity .Possiamo pensare come un indirizzo di riferimento comune,un appiglio,un ponte di collegamento tra due sponde di
un fiume.
Il dato e’ passato in questa interfaccia con il comando:
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
Dall’altra parte in newslistactivity in quesa parte di codice
si recupera l'”id”:
@Override
public void onItemSelected(String id) {
if (mTwoPane) {
// In two-pane mode, show the detail view in this activity by
// adding or replacing the detail fragment using a
// fragment transaction.
Bundle arguments = new Bundle();
arguments.putString(NewsDetailFragment.ARG_ITEM_ID, id);
e lo si passa a newsdetailfragment.
Non ci resta che capire come newsdetailfragment recupera l’informazione “id”
questo è il comando:getArguments().getString(ARG_ITEM_ID)
e finalmente con il comando:
((TextView) rootView.findViewById(R.id.news_detail)).setText(mItem.content);
viene scritto il dato della lista nel nuovo fragment.
Per chi è alle prime armi come me è molto difficile da digerire,è uno degli argomenti più difficili per me ,ma è un passo obbligato da fare per poter sviluppare applicazioni
più semplici da gestire,sembra un paradosso eppure è così.
Questo è lo snippet:
MysnippetFragmentTablet
Quello che ci interessa tra le tante cose è onCreateView qui con un inflate crea la sua grafica

un fragment onchange display

L’appetito vien mangiando ,e allora perchè non creare ora
una piccola app dove ruotando il telefono in landscape
visuallizzeremo le righe su due colonne.
Forse meglio di no! i Fragment sono molto ostici li riprenderemo dopo e allora facciamo quando non esistevano ancora i Fragment

Quando i Fragment non esistevano

Quando i Fragment non esistevano si ricorreva e ancora adesso si fa a una tecnica molto semplice:si disegnava tutte le finestre
sull ‘activity ad esempio quattro FrameLayout ,e si visualizzavano
cliccando i vari bottoni ,a ogni click di un bottone ne sparivano
tre e rimaneva solo quello interessato.
E’ giunta l’ora di fare un primo progetto del genere

Primo Progetto

In questo progetto applicando la tecnica descritta sopra
Visualizzeremo in base al contatto telefonico tutti i sui numeri
di telefono ,se il possessore del telefono possiede vari account
sul telefono molti contatti avranno i numeri di telefono duplicati
per evitare cio’ ricorreremo a un trucco molto semplice descritto
in rete e cioè all ‘uso della struttura “set”leggi qui

Un piccolo Tip

Android studio sta diventando abbastanza potente,sottolinea rosso dove manca qualcosa,con i tasti alt+ins o alt+enter si può rimediare.

Trucchi view

Non indentare più di 10 finestre,
Non inserire più di 80 elementi grafici ma usa ViewStub con la condizione visibility
che elaborerà gli elementi solo se sono visibili.