articolo originale:
HOW TO merge couple of pdf into one

Scarica pdftk. in ubuntu apri un terminale e digita:

sudo apt-get install pdftk

Ora accedi alla dir che contiene i file pdf da concatenare e digita:

pdftk 1.pdf 2.pdf 3.pdf cat output merged.pdf

per concatenarli tutti in ordine alfabetico:

pdftk *.pdf cat output merged.pdf

Ecco altri esempi di utilizzo di pdftk:

(crea alias):
 pdftk A=1.pdf B=2.pdf cat A B output 12.pdf
Estrai pagine selezionate e combinale in un nuovo pdf:
 pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf
Codifica a  128-Bit 
 pdftk mydoc.pdf output mydoc.128.pdf owner_pw foopass
Codifica e richiedi la pw per l'apertura
 pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz
Permetti la stampa del file, una volta aperto:
 pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz allow printing
Decritta un PDF
 pdftk secured.pdf input_pw foopass output unsecured.pdf
Unisci due file di cui uno crittato:
 pdftk A=secured.pdf mydoc.pdf input_pw A=foopass cat output combined.pdf
Decomprimi il pdf
 pdftk mydoc.pdf output mydoc.clear.pdf uncompress
Cerca di riparare un PDF:
 pdftk broken.pdf output fixed.pdf
Separa un PDF  in pagine singole
 pdftk mydoc.pdf burst
Crea un file report dei Metadata e altre info di un PDF
 pdftk mydoc.pdf dump_data output report.txt

android intent action list

elenco principali azioni in android

azioni principali:

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

richiama le azioni dal codice java – esempi

mostra una pagina web:

	Uri uri = Uri.parse("http://www.bogliaccino.it");
 Intent it  = new Intent(Intent.ACTION_VIEW,uri);
 startActivity(it);

//mostra una mappa centrata sulle coordinate GPS (engim artigianelli torino)

Uri uri = Uri.parse("geo:45.0728629,7.6714303");
Intent it = new Intent(Intent.Action_VIEW,uri);
startActivity(it);

//mostra un percorso

Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);

//chiamata telefonica

Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);
Uri uri = Uri.parse("tel.xxxxxx");
Intent it =new Intent(Intent.ACTION_CALL,uri);

//aggiungi i permessi nel manifest: uses-permission id=”android.permission.CALL_PHONE”

//inviasms/mms, call sender program

Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);

//send sms

Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);

//invia mms

Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra("sms_body", "some text");
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png");
startActivity(it);

//invia email

Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
startActivity(Intent.createChooser(it, "Choose Email Client"));
Intent it=new Intent(Intent.ACTION_SEND);
String[] tos={"me@abc.com"};
String[] ccs={"you@abc.com"};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//aggiungi extra

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//play media

Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/song.mp3");
it.setDataAndType(uri, "audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//Uninstall

Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);

//uninstall apk

Uri uninstallUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

//install apk

Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//play audio

Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");
returnIt = new Intent(Intent.ACTION_VIEW, playUri);

//invia extra

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//search
//where pkg_name is the full package path for an application

Uri uri = Uri.parse("market://search?q=pname:pkg_name");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//show program detail page
//app_id è l’application ID sul Market

Uri uri = Uri.parse("market://details?id=app_id");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//cerca con google – search google

Intent intent = new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY,"searchString")
startActivity(intent);

Corso Java Base

Java Collection Framework

snippet code

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class List {
	public static void main (String[] args) {

	 //primo array
	 String[] moto = 
	 { 
	 "Moto Guzzi V35 Imola", 
	 "Yamaha Tenerè XTZ 600", 
	 "Yamaha XT600", 
	 "BMW K100RS", 
	 "BMW R1150GS" };

	 //stampo primo array
	 System.out.println("Primo array");
	 for (String x: moto)
	 System.out.println(x);

	//istanzio un oggetto di tipo list
	 List<String> lista1 = new ArrayList<String>();

	 //aggiungo a lista1 gli elementi di primo array: metodo add();
	 for(String x: moto)
	 lista1.add(x);

	 //secondo array
	 String[] motoVorrei = 
	 { "Suzuki GSR750", "Tenerè XTZ 600", "Honda NC750X" };
	 
	 //stampo primo array
	 System.out.println("Secondo array");
	 for (String z: motoVorrei)
	 System.out.println(z);

	 //nuovo oggetto di tipo list
	 List<String> lista2 = new ArrayList<String>();

	 System.out.println("Aggiungo elementi a lista 2");

	 //add per aggiungere elementi 
	 for(String y: motoVorrei)
	 lista2.add(y);

	 System.out.println("Stampo elementi a lista 2 usendo il metodo size() e get()");
	 //get per conoscere il valore dell'i-esimo elemento, size() metodo che restituisce la dimensione dell'oggetto
	 for (int i = 0; i<lista2.size();i++){
	 System.out.printf("%s \n", lista2.get(i));
	 }

	 System.out.println("Poi aggiungo lista2 a lista1 metodo addAll");

	 //addAll() : metodo per aggiungere tutti i valori dell'oggetto lista2 all'oggetto lista1
	 lista1.addAll(lista2);
	 System.out.println("Stampo la nuova Lista1"); 

	 for (int i = 0; i<lista1.size();i++){
	 System.out.printf("%s \n", lista1.get(i));
	 } 

	 System.out.println("Lista1 modificata con tutti i valori di lista2 aggiunti"); 

	 //
	 for (int i = 0; i<lista1.size();i++){
	 System.out.printf("%s %s \n", i, lista1.get(i));
	 }

	 System.out.println("Lista2 è rimasta uguale: "); 
	 //lista2=null;
	 for (int i = 0; i<lista2.size();i++){
	 System.out.printf("%s \t", lista2.get(i));
	 }

	 //metodo editlist
	 editlist(lista1,lista2);
	 System.out.println("confronto le stringhe e le modifico col metodo editlist"); 
	 for (int i = 0; i<lista1.size();i++){
	 System.out.printf("%s %s \n", i, lista1.get(i));
	 } 

	 }

	private static void editlist(Collection<String> lista1, Collection<String> lista2) {
	 Iterator<String> it = lista1.iterator();
		 while (it.hasNext()){
		 if (lista2.contains(it.next()))
		 it.remove();
		 }
	 }
}

/** JCF: alcuni metodi collection e interfaccia Iterator */

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListEstesa {

	public static void main(String[] args) {

		// primo array
		String[] moto = { "1Guzzi V35 Imola", "2Tenerè XTZ 600", "3XT600",
				"4BMW K100", "5BMW R1150 GS" };
		// secondo array
		String[] motoVorrei = { "6Suzuki GSR750", "7Tenerè XTZ 600",
				"8Honda NC750X" };

		// istanzio oggetto di tipo list
		List<String> lista1 = new ArrayList<String>();
		// nuovo oggetto di tipo list
		List<String> lista2 = new ArrayList<String>();

		// aggiungo elementi del primo array a lista1: metodo add();
		for (String x : moto)
			lista1.add(x);

		// uso add per aggiungere elementi a lista 2
		for (String x : moto)
			lista2.add(x);
		printme(lista1);
		// addAll() : metodo per aggiungere tutti i valori dell'oggetto lista2
		// all'oggetto lista1
		lista1.addAll(lista2);

		printme(lista1);
		rimuoviDaLista(lista1, 3, 5);
		printme(lista1);
		reverseLista(lista1);

	}

	// stampare i valori
	private static void printme(List<String> l) {
		System.out.println("metodo printme");
		for (String a : l)
			System.out.printf("%s \n", a);
		System.out.println();
	}

	// rimuovere elementi
	private static void rimuoviDaLista(List<String> l, int from, int to) {
		System.out.println("metodo rimuovi");
		l.subList(from, to).clear();
	}

	// reverse list
	private static void reverseLista(List<String> l) {
		System.out.println("metodo reverse");
		ListIterator<String> lista = l.listIterator(l.size());
		while (lista.hasPrevious())
			System.out.printf("%s \n", lista.previous());
	}

}

/** JCF: convertire list in array e viceversa */

import java.util.Arrays;
import java.util.LinkedList;
public class Main {
	public static void main (String[] args) {

		 String[] film = { "Pulp Fiction", "Le iene", "Kill Bill" };
		 LinkedList<String> thelist = new LinkedList<String>(Arrays.asList(film));

		 thelist.add("Django Unchained");
		 thelist.addFirst("Jackie Brown");

		 //riconverti ad array
		 film = thelist.toArray(new String[thelist.size()]);

		 for (String x: film)
		 System.out.printf("%s \n", x);

	} 

}
/** JCF: collections metodi sort() e overload con reverseOrder() */

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class Main {

	  public static void main (String[] args) {

		  
		  String[] film = { "Pulp Fiction", "Le iene", "Kill Bill" };
		  List<String> lista1 = Arrays.asList(film);
		  
		  //ordina coi metodi collections
		  Collections.sort(lista1);
		  
		  for (String x: lista1)
			  System.out.printf("%s \n", x);

		  //overload del metodo, 2 parametri
		  //ordina coi metodi collections
		  Collections.sort(lista1, Collections.reverseOrder());
		  
		  for (String x: lista1)
			  System.out.printf("%s \n", x);
	  }	  
	  
}

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 2014

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
Interfaccia utente in Android: Controlli di selezione
Interfaccia utente in Android: Controlli personalizzati

Interfaccia utente in Android: Fragments
Interfaccia utente in Android: ActionBar
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

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): DOM
Trattamento di XML in Android (III): XmlPull
Alternative per leggere e scrivere XML in Android

Localizzazione Geografica in Android

Localizzazione geografica in Android

Mappe in Android

Mappe in Android (Google Maps Android API v2)

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
Servizi Web REST in Android (approfondimento su stackoverflow)

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

 

Sedi corsi 2014

Febbraio-giugno 2014 – Engim Artigianelli Torino – MDL – Corso di specializzazione

Aprile-giugno 2014 – Fondazione ITS – Percorsi di Istruzione Tecnico Superiore post-diploma

Maggio-giugno 2014 – Divitech Leinì, Tierra Leinì – PFA – Corsi di Formazione Aziendale

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”

p5rn7vb

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)