Corso Java Base

Appunti del corso Java Base – Introduzione alla programmazione a oggetti
Torino, marso-maggio 2014, Pier della Francesca, Corso di formazione aziendale
Come testo principale abbiamo adottato il Manuale di Java 7, di Claudio De Sio Cesari, edito da Hoepli

Programma del corso

Argomenti

1. Introduzione a Java

  • Introduzione
  • Compilazione ed esecuzione
  • 2. Sintassi e programmazione strutturata
  • variabili e metodi
  • tipi di dati, array
  • operatori di controllo flusso

3. Sintassi e programmazione OO

  • Object Oriented fondamenti
  • Ereditarieta, Incapsulamento, Polimorfismo
  • sintassi e pratica OO
  • 4. Accesso database
  • ·          accesso a DB via JDBC
  • ·          Object Relation Mapping
  • 5. Eccezioni
  • ·          Classe Exception
  • ·          Try e catch
  • ·          Generazione di eccezioni
  • ·          Creazione di nuove eccezioni

6. Core libraries

  • collezioni e iteratori
  • input/output
  • gestione delle date, numeri complessi e formattazione
  • networking di base

Unità didattiche

Introduzione 8 4

  • 1 Introduzione
  • 2 Installazione ambiente di sviluppo
  • 3 Introduzione linguaggio Java
  • 4 Compilazione ed esecuzione
  • Compilazione ed esecuzione 8 4
  • 5 Sintassi java
  • 6 Basi della programmazione

variabili e metodi 12 4

  • 9 Operatori di assegnazione, relazionali e booleani
  • 10 Operatori aritmetici
  • 11 Pre/post incremento e concatenazione stringhe
  • 12 Variabili locali
  • Metodi
  • Il metodo Main ed i sottoprogrammi
  • Metodi di classe: La parola chiave Static
  • Passaggio dei parametri per riferimento e per valore
  • Modificatori
  • Gestione e importazione dei package

tipi di dati, array 12 4

  • 13 Scope delle variabili
  • 14 Tipi di dato primitivi
  • 15 Caso particolare: la classe String
  • 16 Casting
  • Input/Output utente
  • Array monodimensionali
  • Array multidimensionali

operatori di controllo flusso 16 8

  • 17 Istruzione If-Else e operatore ternario
  • 18 IF annidati
  • 19 Istruzione Switch – case
  • 20 Ciclo While
  • 21 Ciclo Do-While
  • 22 Ciclo For
  • 23 Cicli annidati
  • 24 Cicli infiniti

Object Oriented fondamenti 16 8

  • 25 Labels, Break e Continue
  • 26 Programmazione ad oggetti
  • 27 La programmazione ad oggetti
  • 28 Progettare una Classe
  • 29 Istanziare un Oggetto: il costruttore
  • 30 Variabili d’istanza e incapsulamento
  • 31 Visibilità dei membri di una classe
  • 32 Il reference This
  • Ereditarieta, Incapsulamento, Polimorfismo 12 4
  • 33 La parola riservata null
  • 34 Ereditarietà
  • 35 Il concetto di ereditarietà
  • 36 Strutture ereditarie

Dalla teoria alla pratica: Ereditarietà

  • La parola riservata super
  • La classe Object
  • Impedire l’ereditarietà: la parola riservata final
  • sintassi e pratica OO 8 4
  • 37 Membri statici e membri dinamici
  • 38 Polimorfismo
  • 39 Overloading e Overriding
  • 40 Binding dinamico
  • Casting con oggetti
  • Cast e instanceof
  • Interfacce, classi astratte e classi innestate
  • Interfacce
  • Ereditarietà e polimorfismo nelle interfacce
  • Classi astratte
  • Classi innestate
  • Classi anonime

accesso a DB via JDBC 16 8

  • 41 Introduzione a JDBC
  • 42 Convenzioni JDBC URL Naming
  • 43 Gestione dei driver: il DriverManager
  • 44 Gestione degli errori
  • 45 Le SQLException
  • 46 Supporto per i tipi di dati
  • 47 Estensioni standard di JDBC
  • 48 Connection Pooling
  • Object Relation Mapping 8 4
  • 49 Gestione dei dati: JDBC
  • 50 DB

Classe Exception 8 4

  • 53 Eccezioni
  • 54 Errori ed eccezioni
  • 55 Il costrutto TRY-CATCH-FINALLY
  • 56 Tipi di eccezione ed il costrutto Throws
  • Try e catch 12 4
  • 57 Lanciare un’eccezione: il costrutto Throw
  • 58 Eccezioni personalizzate
  • Generazione di eccezioni 8 4
  • Creazione di nuove eccezioni 8 4

collezioni e iteratori 8 4

  • 69 Il Framework Collections
  • 70 Framework Collections
  • 71 Foreach ed Iterator
  • 72 Implementazioni di Set e SortedSet
  • input/output 12 4
  • 73 Implementazioni di List
  • 74 Implementazioni di Queue
  • 75 Implementazioni di Map e SortedMap
  • 76 Tipi Generics

gestione delle date, numeri complessi e formattazione 8 4

  • 77 Input/Output
  • 78 Introduzione all’I/O: input da tastiera
  • 79 Java.io: Leggere un file
  • 80 Java.io: Scrivere su un file
  • networking di base 8 4
  • 81 Java.io:Operazioni su file
  • 82 Networking: Socket

Programma corso android

Febbraio giugno 2014 – Engim Torino – Corso di specializzazione

Ambiente di sviluppo Android
Struttura di un progetto Android
Componenti di un’applicazione Android
Sviluppo di una semplice applicazione Android

  • HelloAndroid
  • LanciaMoneta
  • LanciaDadi

Interfaccia utente in Android

Interfaccia utente in Android: Layouts
Interfaccia utente in Android: Controlli base (I)
Interfaccia utente in Android: Controlli base (II)
Interfaccia utente in Android: Controlli base (III)
Interfaccia utente in Android: Controlli di selezione (I)
Interfaccia utente in Android: Controlli di selezione (II)
Interfaccia utente in Android: Controlli di selezione (III)
Interfaccia utente in Android: Controlli di selezione (IV)
Interfaccia utente in Android: Controlli personalizzati (I)
Interfaccia utente in Android: Controlli personalizzati (II)
Interfaccia utente in Android: Controlli personalizzati (III)
Interfaccia utente in Android: Tabs
Interfaccia utente in Android: Fragments
Interfaccia utente in Android: ActionBar (I): Introduzione
Interfaccia utente in Android: ActionBar (II): Tabs
Interfaccia utente in Android: ActionBar Compat
Interfaccia utente in Android: Navigation Drawer

Menu in Android

Menu in Android (I): Menu e Submenu base
Menu in Android (II): Menu Context
Menu in Android (III): Opzioni avanzate

Widgets in Android

Interfaccia utente in Android: Widgets (I)
Interfaccia utente in Android: Widgets (II)

Gestione di Preferenze in Android

Preferenze in Android I: SharedPreferences
Preferenze in Android II: PreferenceActivity

Basi di Dati in Android

Basi di dati in Android (I): Primi passi con SQLite
Basi di dati in Android (II): Insert, update e delete record
Basi di dati in Android (III): select record

File in Android

File in Android (I): Memoria Interna
File in Android (II): Memoria Esterna (SD Card)

Trattamento di XML in Android

Trattamento di XML in Android (I): SAX
Trattamento di XML in Android (II): SAX simplicado
Trattamento di XML in Android (III): DOM
Trattamento di XML in Android (IV): XmlPull
Alternative per leggere e scriver XML in Android

Localizzazione Geografica in Android

Localizzazione geografica in Android (I)
Localizzazione geografica in Android (II)

Mappe in Android

Mappe in Android (Google Maps Android API v2) – I
Mappe in Android (Google Maps Android API v2) – II
Mappe in Android (Google Maps Android API v2) – III

Content Providers in Android

Content Providers in Android (I): Costruzione
Content Providers in Android (II): Utilizzo

Notifiche in Android

Notifiche in Android (I): Toast
Notifiche in Android (II): Barra di stato
Notifiche in Android (III): Dialogs

Accesso a Servizi Web in Android

Servizi Web SOAP in Android (1/2)
Servizi Web SOAP in Android (2/2)
Servizi Web REST in Android (1/2)
Servizi Web REST in Android (2/2)

Processi in background in Android

Processi in background I: Thread e AsyncTask
Processi in background II: IntentService

Debug di applicazioni in Android

Debug in Android: Logging

Approfondimenti

Google Play Services

Notifiche Push in Android – Google Cloud Messaging (GCM / C2DM)

Implementazione del Server

Implementazione del Client Android

Integrazione con Google+

Sessione Google+ (Sign-In)

Profilo e cerchie

Corso Android #10

Array e adapter

ListView

● Componente comunemente usato in una GUI su Android: la lista scrollabile
● Ogni elemento è a sua volta una View
● Quindi la ListView è un ViewGroup pur non essendo un layout
● Ci sono altri casi simili
– Gallery, CalendarView, DatePicker…

Array

Se le view contenute nella ListView sono statiche

  • Si definisce un array di risorse in res/values
  •  Si imposta l’attributo android: entries del tag <ListView> con un riferimento alla risorsa array

Approccio con vantaggi e svantaggi

  • Comodo quando i valori vanno configurati:
  • Per lingua, nazione, carrier, ecc.
  • Limitato sui dati visualizzabili:
  • Solo statici, solo testi semplici
Res/values/arrays.xml

Più spesso, i dati da visualizzare in una ListView sono dinamici
● Generati dal programma
● Estratti da un database
● Ottenuti da un servizio web
● Ecc.

In questi casi, si accoppia una ListView a un Adapter

● ArrayAdapter, CursorAdapter, ListAdapter, …

Un Adapter ha diversi compiti
● Ottenere i dati “grezzi” per una entry
● Costruire una View che rappresenti graficamente i dati “grezzi”
● Fornire la View al ViewGroup a cui l’Adapter è associato
● Notificare gli Observer quando i dati cambiano
● Alcuni altri compiti “amministrativi”
● È sempre possibile scrivere propri Adapter custom

Le diverse sottoclassi di Adapter traducono diversi formati di dati “grezzi”
● ArrayAdapter<T>: un array (Java) di elementi di tipo T
● Vari costruttori, con parametri:
● Context (per accedere alle risorse)
● ID del layout (XML) da utilizzare
● ID della TextView dentro il layout da popolare con i dati
● T[ ] o List<T> contenente i dati “grezzi”

altre forme di Adapter

  • CursorAdapter

– Adatta i risultati di una query SQL

  • ResourceCursorAdapter

– Adatta un array di risorse XML come se fosse un database

  • SimpleCursorAdapter

– Usa i risultati di una query SQL come identificatori per accedere
a testi e immagini fra le risorse XML

  • SimpleAdapter

– Usa una ArrayList<Map>, una riga per entry, una chiave nella
Map per ogni campo della riga (stringhe, booleani, immagini)

 

Oltre a visualizzare dati (con scroll), le ListView sono spesso usate per consentire all’utente delle scelte
● Attivare un elemento da una lista (azione → button)
● Scegliere un elemento da una lista (opzione → radio)
● Selezionare zero o più elementi da una lista (opzione → check)
● Espandere o collassare sezioni di una lista gerarchica (navigazione → tree)

Per riconoscere il click su un elemento;
● Si implementa l’interfaccia OnItemClickListener
● Lo si associa alla lista con setOnItemClickListener()
● Si aspetta che venga chiamato onItemClick()

ListActivity

Android fornisce una sottoclasse di Activity specializzata per contenere ListView
● Il layout di default contiene due view:
– La ListView, con id “@android:id/list” (= “list”)
– Opzionalmente, una view per il caso di lista vuota, con id “@android:id/empty”
● È anche possibile usate setContentView() per sostituire un proprio layout a quello di default
– Il proprio layout deve però contenere una ListView “list” e opzionalmente la view “empty”

Corso Android #9

Menu

● Android utilizza un sistema non-convenzionale per i menu
● Niente liste gerarchiche con etichette…
● Tre stadi:
● Il menu “primario” è composto da (solitamente al più) 6 caselle
con icone e opzionalmente testo
● Una di queste può essere un “Altro…” che mostra una lista di
voci più lunga
● Una voce può aprire un sottomenù (finestra floating)
● Si possono anche avere menù contestuali
● Richiamabili da un long click su una View

Il sistema decide autonomamente
come, dove e quante voci mostrare nel
menu primario
● Rispetta però l’ordine di importanza definito
dal programmatore
● Aggiunge automaticamente la voce “More”
che apre un menu secondario se ci sono
altre voci
● Il menu primario mostra preferibilmente
icone+testo, non checkmark o altro
● Il sistema può spostare delle voci
nell’ActionBar (da Honeycomb in poi)

Il modo più semplice di creare un menù è di usare
(come al solito) un file XML in res/menu/

<menu> definisce un menu
● <item> definisce una voce (con eventuale
sottomenu)
● <group> può essere usato per raggruppare più
<item> logicamente correlati, ma in maniera
“invisibile”
● Gli <item> ereditano alcune proprietà da <group>
– Per esempio, possono essere abilitati/disabilitati in blocco

Corso Android #8

Widget

Un ViewGroup può contenere un numero qualunque di View

● ViewGroup è una sottoclasse di View
● → Tipica gerarchia ad albero
● Una View che gestisce input è detta Widget
● Un contenitore di Widget è
detto Widget Host

Un ViewGroup che determina il
posizionamento dei figli è detto
LayoutManager

Il posizionamento si basa una
una negoziazione fra esigenze
del contenitore ed esigenze dei
contenuti
● Esistono molte strategie possibili
● E di conseguenza, molti layout
manager diversi

In Eclipse, i widget sono raggruppati in categorie
 Form widgets . classici (pulsanti, checkbox, …)
Text fields . campi di testo con varie regole di validazione
dell’input (nomi, numeri, password, …)
Composite . widgets che ne includono altri (tab multiple,
listview, webview, …)
Images & Media . widget per i multimedia (player video,
galleria di foto, c)
Time & Date . gestione del tempo (calendari, orologi, ecc.)
Advanced . widget specializzati (zoom, OpenGL, c)

button

Per i casi più semplici, la classe View offre anche la possibilità di definire nel layout XML il nome del metodo da chiamare in risposta a un evento

● Deve essere un metodo con un parametro di tipo View e tipo di ritorno void
● Deve essere un metodo definito nel “contesto” (ovvero: nell’Activity a cui appartiene la view)

Corso Android #7

View e Layout

view

Una UI Android è un albero con foglie di classe  View e nodi intermedi di classe ViewGroup
● tipicamente definito in XML
● ogni View è una classe Java con nome uguale al tag XML relativo

La disposizione visuale delle view è regolata da un Layout

A run-time, esiste un albero di oggetti Java che creato a partire dall’albero XML del layout
● Gli oggetti possono ricevere input dall’utente (si interfacciano col sistema touch)
● Quando si verifica un evento significativo, viene chiamato un handler
● La vostra Activity può registrare propri handler
● In Java, sono inner interfaces dentro la classe View
● Ogni interfaccia definisce un metodo on…Listener()

i costruttori

● View(Context c)
– Costruttore di base, associa la view al suo context (tramite il quale accedere, per esempio, alle risorse)
● View(Context c, AttributeSet attr)
– Costruttore chiamato quando la view viene creata a partire dalla specifica XML in un file di layout
– Da attr si possono ottenere i valori degli attributi, tramite metodi getter come getAttribute<tipo>Value(String namespace, String attributo, <tipo> valoreDefault)
● View(Context c, AttributeSet attr, int stile)
– Costruttore che in aggiunta applica uno stile (identificato dal suo ID di risorsa)

View(): non si può avere una view senza il suo contesto

 layout

  • AbsoluteLayout  Coordinate assolute (x,y) per ogni componente
  • LinearLayout  Serie verticale o orizzontale di componenti
  • RelativeLayout  Posizione di ogni componente relativo agli altri
  • GridLayout Griglia di celle di uguale dimensione; componenti a cavallo di più celle
  • FrameLayout  Componenti uno sull’altro (l’ultimo aggiunto sta in cima) – solitamente usato con un solo componente
  • TableLayout  Griglia di celle di dimensione variabile (dinamicamente); un componente per cella (salvo eccezioni, come in HTML)
  • È sempre possibile comporre layout o scrivere i propri Layout Manager

 

Corso Android #6

Attività e Intent

Attività in Android

activity

● Un’attività atomica dell’utente
● Concretizzata da una “schermata”
● Può essere composta da vari Fragment

intent

Un messaggio che esprime un’intenzione dell’utente o di una applicazione affinché qualcosa avvenga
● Numerosissimi Intent di sistema, ogni app può definirne altri
● Una parte della struttura del messaggio è fissata, ma possono includere dati “extra” a piacere
● Gli Intent possono essere indirizzati a uno specifico componente, oppure emessi in broadcast
● Ogni applicazione può definire un filtro che dichiara a quali Intent è interessata e può rispondere

ACTION_MAIN
ACTION_VIEW
ACTION_ATTACH_DATA
ACTION_EDIT
ACTION_PICK
ACTION_CHOOSER
ACTION_GET_CONTENT
ACTION_DIAL
ACTION_CALL
ACTION_SEND
ACTION_SENDTO
ACTION_ANSWER
ACTION_INSERT
ACTION_DELETE
ACTION_RUN
ACTION_SYNC
ACTION_PICK_ACTIVITY
ACTION_SEARCH
ACTION_WEB_SEARCH
ACTION_FACTORY_TEST

intent filter

Un Intent Filter consente di specificare quali Intent vogliamo ricevere, in base a
● Action (indichiamo il nome dell’azione)
● Category (indichiamo il nome della categoria)
● Data (indichiamo il tipo MIME e/o lo schema dell’URI)
● Ogni componente (Activity o altro) dichiara i suoi Intent Filter fra i suoi metadati

 

Karate for kids #1

Android App karate dojo kun

Ascolta, impara e pratica queste semplici regole nella pratica del karate, ma anche fuori dal dojo

Android App per insegnare ai miei piccoli allievi il dojo kun!

Scaricala dal play store

Con i disegni di Marco Bracciani

dojo kun, le regole del dojo: il luogo in cui si cerca la via

Karate Dojo Kun - screenshot thumbnail

Hitotsu! Jinkaku kansei ni tsutomuru koto!
Cerca di perfezionare il carattere

Hitotsu! Makoto no michi o mamoru koto!
Percorri la via della sincerità

Hitotsu! Doryoku no seishin o yashinau koto!
Rafforza instancabilmente lo spirito

Hitotsu! Reigi o omonzuru koto!
Osserva un comportamento impeccabile

Hitotsu! Kekki no yu o imashimuru koto!
Astieniti dalla violenza e acquisisci Autocontrollo

 

Android appunti per corso #40

Risorse alternative
● In moltissimi casi, le risorse devono essere adattate all’ambiente

Alcuni esempi
● Stringhe per le varie lingue (localizzazione)
● Colori adattati al paese (es.: bandiere)
● Layout diversi in base all’orientazione del dispositivo :)
● Icone diverse per carrier diversi (es.: logo)
● Immagini a risoluzioni diverse
● ecc.

Si possono definire risorse specializzate tramite l’uso di qualificatori
● Nella directory res/, si affiancano alle sottodirectory di default
● Nella forma: res/tipo-qualificatori/file
● Esempio:
res/drawable/icon.png
res/drawable-ldpi/icon.png
res/drawable-hdpi/icon.png

Qualificatori – SIM e rete

Mobile Country Code / Mobile Network Code
● Formato: -mccMCC, -mncMNC
● -mcc222 = Italia, -mcc222-mnc010 = Vodafone IT
MCC MNC Marca Operatore Note
222 1 TIM Telecom Italia SpA
222 2 Elsacom Ritirato
222 10 Vodafone Vodafone Omnitel N.V.
222 30 RFI Rete Ferroviaria Italiana
222 77 IPSE 2000 Ritirato
222 88 Wind Wind Telecomunicazioni SpA
222 98 Blu Ritirato
222 99 3 Italia Hutchison 3G

Qualificatori per lingua e regione

● Formato: -lingua-regione
● -it = italiano,
-en-rUS = Inglese, USA
-es-rUS = Spagnolo, USA
● Lingue: it, fr, en, es, …
● Regioni: IT, FR, CA, GB, US, ES, …
● Le Regioni coincidono (quasi) sempre con i TLD

Qualificatori – schermo

Dimensione minima dello schermo
● Lungo l’asse minore, quale che sia
● Formato: -swNdp
● -sw300dp = minimo 300 pixel lungo l’asse minore
● Dimensione dello schermo in larghezza
● Formato: -wNdp
● -w720dp = minimo 720 pixel in larghezza

Dimensione dello schermo in altezza
● Formato: -hNdp
● -h600dp = minimo 600 pixel in altezza
● Dimensione generale dello schermo
● Formato: -dimensione
● -small, -normal, -large, -xlarge

Aspetto dello schermo (rapporto w:h, approx)
● Formato: -aspetto
● -long (stile 16:9), -notlong (stile 4:3)
● Orientamento dello schermo
● Formato: -orientamento
● -port (portrait), -land (landscape)

Qualificatori di ambiente
Dock mode: se il dispositivo è in un dock
Formato: -dockmode
-car (installato in dock in auto), -desk (sul tavolo)
Night mode: se e giorno o notte
Formato -nightmode
-night (e notte), -notnight (e non-notte :-)

Densità del display
● Formato: -densità dpi
Valori ammessi:
● -ldpi = ~120dpi, -mdpi = ~160dpi, -hdpi = ~240dpi
● -xdpi = ~320dpi (Retina-style)
● -tvdpi = ~213dpi (densità delle TV)
● -nodpi = pixel assoluti, bitmap da non scalare
Tipo di touch screen
● Formato: -tipotouch
● -notouch, -stylus (penna), -finger (dito)

Qualificatori – input
Tastiera
Formato: -keystipo
● -keysexposed,
-keyshidden, -keyssoft
Formato: -tipohw
● -nokeys, -qwerty,
-12key
Tasti “cursore”
Formato: -navtipo
● -navexposed, -navhidden
Formato: -tiponav
● -nonav, -dpad, -trackball, -wheel

Qualificatori – versione OS
Versione di Android (API level) corrente
Formato: -vversione
● -v9 (Gingerbread), -v14 (Ice Cream Sandwich)

Si possono indicare più qualificatori in sequenza
Tutte le parti sono opzionali, ma devono essere
nell’ordine in cui li abbiamo presentati!
Es:
● res/drawable-de-rVA-night/button.png

A run-time, il Resource Manager individua, per ogni risorsa, quale fra
le tante alternative usare, usa un algoritmo per cercare il match migliore

Ogni volta che la configurazione corrente cambia, il sistema riavvia l’Activity corrente con il nuovo
insieme di risorse migliori