HTML.it logo
Learn
  • Design
    • Grafica
    • User Interface Design
    • Adobe Creative Suite
    Guide
    Approfondimenti
    Faq
    Notizie
    Tutto in Design >
  • Development
    • .NET
    • ASP
    • CMS
    • Flash
    • Java
    • JavaScript
    • PHP
    • Essentials
    • Ruby
    • XML
    • Editor
    • CSS
    • HTML
    Guide
    Approfondimenti
    Script
    Faq
    Notizie
    Tutto in Development >
  • Mobile
    • Android Studio
    • Cordova
    • Eclipse
    • Objective C
    • Swift
    Guide
    Approfondimenti
    Script
    Faq
    Notizie
    Tutto in Mobile >
  • Server
    • Cloud
    • Database
    • OS
    • Sicurezza
    • Network
    Tutto in Server >
  • Digital Marketing
    • SEO
    • Affiliate Marketing
    • Social Media Marketing
    Tutto in Digital Marketing >
  • Makers
    • Arduino
    • RaspberryPi
    • Stampa 3D
    Guide
    Approfondimenti
    Notizie
    Tutto in Makers >
  • Game Design
    • Unity
    Guide
    Approfondimenti
    Notizie
    Tutto in Game Design >
Download
  • Audio e Video
    • Player Audio Video
    • Codec audio
    • Editor audio video
    • Masterizzazione
    • Ripper e Convertitori
    • Speech
    Tutto in Audio e Video >
  • Educazione
    • Bambini
    • Cucina
    • Salute e Benessere
    • Istruzione
    Tutto in Educazione >
  • Giochi
    • Arcade
    • Avventura
    • Azione
    • Board
    • Carte
    • Giochi di ruolo
    • Giochi Online
    • Puzzle e Enigmistica
    • Simulazione
    • Sparatutto
    • Sport
    • Strategia e Giochi di Guerra
    • Tempo Libero
    Tutto in Giochi >
  • Grafica
    • Accessori & Mappe
    • Animazione
    • CAD – 3D
    • Cattura schermo
    • Convertitori e ridimensionatori
    • Editor
    • Flash
    • Font
    • Fotoritocco
    • Gallerie e album
    • Icone e loghi
    • Visualizzatori
    Tutto in Grafica >
  • Internet
    • Browser
    • Chat e IM
    • eMail
    • Estensioni & Temi
    • FTP
    • Network
    • News e RSS
    • Peer to Peer
    • Webcam
    Tutto in Internet >
  • Programmazione
    • Accessori
    • CMS e E-Commerce
    • Editor e Compilatori
    • Editor e strumenti Web
    • Linguaggi
    Tutto in Programmazione >
  • Sicurezza
    • Antispam
    • Antispyware
    • Antivirus
    • Server
    Tutto in Sicurezza >
  • Produttività
    • Backup
    • Compressione
    • Connettività
    • Database
    • Fax e Telefonia
    • Gestione disco
    • Ottimizzazione
    • Ufficio
    • Utilità di Sistema
    Tutto in Produttività >
Notizie
Video
Forum
in  
Trend
GuideHTMLJavaLinguaggio CPythonJavaScriptPHPC++CSSAndroidApprofondimenti
INDICE DELLA GUIDA
Primi passi con Android
  1. 1 Introduzione: perché Android

  2. 2 L'SDK e l'ambiente di sviluppo

  3. 3 Come sviluppare app Android: ibrido o nativo?

  4. 4 Gli elementi e il funzionamento di base di un'applicazione

  5. 5 Il ciclo di vita di un'app Android

  6. 6 La prima app Android con Eclipse

  7. 7 Android Studio: creare un'app Android

Il cuore di un’app Android
  1. 8 Activity, la "prima pagina" dell'applicazione

  2. 9 Il ciclo di vita di un'Activity

  3. 10 Gestire le risorse e gli asset

  4. 11 Intent e messaggi

  5. 12 Le permission

L’interfaccia grafica (GUI)
  1. 13 Il layout di un'app Android

  2. 14 Definire layout in XML, il markup di base

  3. 15 View: le basi dell'interfaccia grafica

  4. 16 Controlli utente

  5. 17 Creare un menu

  6. 18 ActionBar

  7. 19 Le notifiche in Android

  8. 20 Notifiche: Toast e Dialog

  9. 21 Visualizzare pagine Web: WebView

  10. 22 ListView e GridView

  11. 23 Spinner (menu a tendina)

  12. 24 Stili e temi

  13. 25 Creare Custom Adapter

  14. 26 Fragment in Android

  15. lezione
    27 di 96

    Layout adattabili Smartphone/Tablet in Android

Lo storage
  1. 28 Gestire i file

  2. 29 Memorizzare informazioni con SharedPreferences

  3. 30 Database e SQLite

  4. 31 Condividere i dati con i Content Provider

  5. 32 Accedere a ContentProvider

  6. 33 Gestire i dati con Realm

Processi e servizi
  1. 34 Threading

  2. 35 Lavoriamo in backgroud con i Service

Android e il networking
  1. 36 Accedere alla Rete con Volley

  2. 37 Servizi REST su Android

Hardware e sensori
  1. 38 Sensori e SensorManager in Android

  2. 39 Geolocalizzazione con Android

  3. 40 Accelerometro: come utilizzarlo

  4. 41 Touchscreen ed eventi Touch

  5. 42 Multitouch

  6. 43 Rilevare le gesture

  7. 44 Bluetooth

  8. 45 NFC

  9. 46 Fingerprint API

Multimedia
  1. 47 Scattare una foto

  2. 48 Registrare un video

  3. 49 MediaPlayer: riprodurre file audio

  4. 50 MediaPlayer: riprodurre file video

  5. 51 Gestire l'audio

  6. 52 Android e la low latency

  7. 53 Leggere codici a barre e QR code

  8. 54 Face Detection

Grafica
  1. 55 Animazioni con XML

  2. 56 Supporto multirisoluzione

  3. 57 Animazioni con ViewPropertyAnimator

  4. 58 Accelerazione hardware

Telefono
  1. 59 Gestire gli SMS

  2. 60 Elenco delle chiamate: la gestione in Android

  3. 61 Chiamare ed intercettare una chiamata

  4. 62 Gestire i Contatti

Testing delle app
  1. 63 Test delle app

  2. 64 Test con JUnit

  3. 65 Unit Test con Hamcrest

  4. 66 Test delle interfacce utente

  5. 67 Test delle interfacce con Espresso

Pubblicare un’app
  1. 68 AndroidManifest.xml e le capabilities

  2. 69 Preparare l'app per la pubblicazione

  3. 70 Iscrizione a Google e invio dell'app

  4. 71 Market alternativi

  5. 72 Modelli di Monetizzazione

Android Architecture Components
  1. 73 Android Architecture Components

  2. 74 Lifecycle

  3. 75 ViewModel e LiveData

  4. 76 ViewModel: un esempio pratico

  5. 77 Room: ORM su SQLite

  6. 78 Architettura unica con Room, ViewModel e LiveData

Appendice
  1. 79 Riepilogo: Controlli Utente

  2. 80 L'Application Context

  3. 81 Gestione dell'input: un esempio

  4. 82 Applicazioni di rete: un RSS reader

  5. 83 Esecuzione e debug su Eclipse ADT

  6. 84 Eseguire test sull'emulatore e sullo smartphone

  7. 85 Android e la rete

  8. 86 Consumare servizi REST da Android

  9. 87 Debug di applicazioni Android

  10. 88 App Widget

  11. 89 Integrare Github in Android Studio

  12. 90 Creare librerie Android

  13. 91 Adaptive Icons

  14. 92 Android e Java 8

  15. 93 Bluetooth Low Energy (BLE)

  16. 94 Leggere dati in formato JSON

  17. 95 App shortcuts

  18. 96 Instant app

  • Learn
  • Guida Android
  • Layout adattabili Smartphone/Tablet in Android
lezione
27 di 96

Layout adattabili Smartphone/Tablet in Android

  • di Giuseppe Maggi
  • 2 Luglio 2014

I Fragments possono essere visti come blocchi componibili che permettono di rendere il layout adattabile al dispositivo. Se la frammentazione dei dispositivi rappresenta una problematica di rilievo per i programmatori Android, i Fragments rappresentano in buona parte una soluzione.

Layout smartphone e tablet per Android

La figura (fonte: documentazione ufficiale Android) mostra due dispositivi di tipo diverso ed in configurazioni differenti:

  • uno smartphone in portrait. Immaginiamolo con uno schermo piccolo, anche 3 pollici;
  • un tablet, quindi schermo almeno da 7 pollici, posizionato in landscape.

I layout presenti su entrambi sono costituiti da due fragments, gli stessi due Fragment: FragmentA e FragmentB.

Con adeguate configurazioni delle risorse e qualche aggiunta al codice visto nel capitolo precedente possiamo creare anche noi un layout adattabile che riesca a mostrarsi in one-pane su smartphone e two-pane su tablet in landscape.

Configurazione delle risorse

Parlando delle risorse, avevamo accennato alla loro gestione multipiattaforma. È arrivato il momento di vederla al lavoro, costituirà il punto di partenza del nostro layout adattabile.

Creiamo due cartelle di risorse layout:

  • layout-large-land che verrà usato solo per dispositivi con display large in posizione landscape;
  • layout, la cartella di default. Verrà chiamata in causa per tutte le altre situazioni.

La configurazione multipla ha successo se in entrambe le cartelle mettiamo il file di layout con il medesimo nome, activity_main.xml.

Da questo momento, l’Activity cercherà sempre la risorsa R.layout.activity_main ma questa, in base alla configurazione del dispositivo, corrisponderà ora al file res/layout-large-land/activity_main.xml ora al file res/layout/activity_main.xml.

Vediamo entrambi i file di layout.

File 1: res/layout/activity_main.xml:


<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Questo primo layout è identico a quello visto nel capitolo precedente. È un FrameLayout che ospiterà un fragment singolo assegnato dinamicamente con FragmentTransactions.

File 2: res/layout-large-land/activity_main.xml:


<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="it.html.guida.gui.fragments.CountryFragment"
        android:id="@+id/countryfrag"
        android:layout_width="0dp"
    	  android:layout_height="match_parent"
    	android:layout_weight="1"/>
    <fragment android:name="it.html.guida.gui.fragments.CityFragment"
        android:id="@+id/cityfrag"
        android:layout_width="0dp"
    	android:layout_height="match_parent"
    	android:layout_weight="2"/>
</LinearLayout>

Nel layout two-pane, i Fragments appaiono insieme sin dall’inizio mentre le FragmentTransactions non dovranno più intervenire. Come segnaposti, abbiamo i tag <fragment>. Il loro attributo android:name indica quale tipo di Fragment dovrà posizionarsi in ogni collocazione.

Comunicazione tra Fragments

L’Activity svolge il ruolo di snodo funzionale e di comunicazione tra i due Fragments sia che essi appaiano contemporaneamente sia che si alternino sul display.

Affinchè i Fragments siano riutilizzabili in più contesti è necessario che non si conoscano tra loro né che conoscano l’Activity alla quale, comunque, devono essere collegati. “Massima coesione, minimo accoppiamento”: questo potrebbe essere lo slogan dei Fragments.

All’interno dei Fragment non verrà mai menzionata esplicitamente la classe di appartenenza dell’Activity .

Piuttosto verrà definita un’interfaccia che sarà implementata dall’Activity. Questa interfaccia costituirà il “protocollo” di comunicazione Fragment-Activity.

L’esempio: Paesi e città

L’esempio mette in pratica il classico modello master/detail. Il master è un fragment, classe CountryFragment, che mostra una lista di Paesi. La scheda detail invece è un CityFragment che mostra un elenco di città appartenenti al Paese selezionato nel master.

In base alle premesse iniziali, vogliamo che i Fragments si presentino accoppiati su schermi large in landscape e si alternino in tutti gli altri casi.

A scopo di esempio, la sorgente dati è fittizia. È totalmente contenuta in una classe CountryList, già usata nel capitolo sugli Spinner. Si invocheranno i metodi:

  • Collection<String> getCountries(): restituisce l’elenco dei Paesi;
  • Collection<String> getCitiesByCountry(String country): restituisce un elenco di città situate nel Paese.

Selezionando un elemento nella lista dei Paesi, è necessario che l’elenco di città presente nell’altro fragment venga aggiornato. In tutto questo, l’Activity svolgerà il ruolo di mediatore.


public class CountryFragment extends ListFragment 
{
	interface OnFragmentEventListener
	{
		void selectCountry(String c);
	}
	private OnFragmentEventListener listener=null;
	private CountryList l=new CountryList();
	private String[] countries=null;
	public CountryFragment() 
	{
		countries=new String[l.getCountries().size()];
		l.getCountries().toArray(countries);
	}
	@Override
	public void onAttach(Activity activity) 
	{
		super.onAttach(activity);
		listener=(OnFragmentEventListener) activity;
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
	{
		ArrayAdapter<String> adapter=new ArrayAdapter<String>((Context) listener,android.R.layout.simple_list_item_1,countries);
		setListAdapter(adapter);
		return super.onCreateView(inflater, container, savedInstanceState);
	}
	@Override
	public void onListItemClick(ListView lv, View v, int position, long id) 
	{	
		listener.selectCountry(countries[position]);
	}
}

Il CountryFragment mostra alcune particolarità:

  • contiene un’interfaccia OnFragmentEventListener. Se si osserva il metodo onAttach si vede che tale interfaccia verrà usata per riferirsi all’Activity senza dover usare esplicitamente la sua classe;
  • è stato esteso ListFragment che funziona in maniera simile al ListActivity. All’interno dell’onCreateView viene impostato l’Adapter;
  • onListItemClick rappresenta il momento in cui si notifica all’Activity che è stato selezionato un Paese.

Il codice dell’Activity è il seguente:


public class MainActivity extends ActionBarActivity implements OnFragmentEventListener{
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		if (findViewById(R.id.container) != null) 
		{
			// Se è presente il FrameLayout con id container, 
			// vuol dire che siamo in SINGLE-PANE perciò
			// è necessario aggiungere il Fragment con la transazione.
			// Se savedInstanceState non è nullo, non siamo alla
			// prima visualizzazione perciò non serve aggiungere il Fragment.
			if (savedInstanceState != null) 
				return;
			getSupportFragmentManager().beginTransaction()
						.add(R.id.container, new CountryFragment()).commit();
		}
	}
	@Override
	public void selectCountry(String c) 
	{
		CityFragment cityFrag = (CityFragment)
                getSupportFragmentManager().findFragmentById(R.id.cityfrag);
        if (cityFrag != null && cityFrag.isInLayout()) 
        {
        	// Il Fragment delle città è già nel layout quindi
        	// ne chiediamo solo l'aggiornamento.
            cityFrag.onSelectedCountry(c);
        }
        else
        {
        	// Siamo in SINGLE-PANE, quindi le FragmentTransaction 
        	// operano lo switch tra Fragment.
        	CityFragment frag= new CityFragment();
        	Bundle b=new Bundle();
        	b.putString("country", c);
        	frag.setArguments(b);
        	FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
        	ft.replace(R.id.container, frag);
        	ft.addToBackStack(null);
        	ft.commit();
        }
	}
}

L’Activity si troverà esplicitamente a dover gestire l’esatta composizione del layout. Se si notano i commenti nel codice si vede come si procede:

  • onCreate: se nel layout è reperibile il layout con id R.id.container si è per forza in one-pane;
  • selectCountry: se si trova presente nel layout un CityFragment allora siamo in two-pane altrimenti si fa uso delle FragmentTransaction per reperirlo.

L’ultimo codice da mostrare è il CityFragment:


public class CityFragment extends ListFragment 
{
	private ArrayAdapter<String> adapter=null;
	private CountryList l=new CountryList();
	public CityFragment() {
	}
	@Override
	public void onActivityCreated(Bundle savedInstanceState) 
	{
		super.onActivityCreated(savedInstanceState);
		adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1);
		setListAdapter(adapter);
		Bundle b=getArguments();
		if (b!=null)
		{
			String c=b.getString("country");
			onSelectedCountry(c);
		}
	}
	public void onSelectedCountry(String country)
	{
		adapter.clear();
		adapter.addAll(l.getCitiesByCountry(country));
	}
}

Al suo interno, la richiesta di aggiornamento del layout viene fatta mediante l’invocazione di onSelectedCountry. Notare inoltre l’utilizzo degli arguments per passare valori nella comunicazione Fragment-Activity.

Conclusioni

Sicuramente questo è un esempio molto basilare ma che vuole fornire i rudimenti per poter creare applicazioni più complesse rese flessibili dall’attuazione delle regole viste sinora:

  • Fragments collegati tra loro il minimo possibile per permetterne un maggior riutilizzo;
  • Activity usata per lo più come snodo di comunicazione tra Fragments;
  • risorse in grado di saparare all’origine i layout distinguendo con id diversi i contenitori dei Fragments;
  • ogni classe Fragment deve avere sin dalla nascita uno scopo ben preciso e contenere in sé tutta la logica necessaria per raggiungerlo in maniera indipendente.

Se vuoi aggiornamenti su Android, mobile inserisci la tua e-mail nel box qui sotto:

Se vuoi ricevere informazioni personalizzate compila anche i seguenti campi:

28 / 96

Gestire i file

Ultime notizie

FinalCrypt: File Encryption Application open source

PHP: meno ricerche = meno utilizzatori?

Ubuntu 14.04: fine del supporto il 30 aprile 2019

Social media marketing: gli errori più frequenti

IBM Think 2019: nuove soluzioni per il Cloud ibrido

I Video di HTML.it

Matteo Anelli, LibGDX

Percorsi formativi correlati
Android Mobile Developer

Android Mobile Developer

5
guide
250 ore

Tutti i linguaggi per diventare uno sviluppatore di app per Android.

DB Administrator

DB Administrator

4
guide
80 ore

Come creare applicazioni per il Web con PHP e MySQL per il DBMS.

iOS Mobile Developer

iOS Mobile Developer

4
guide
180 ore

Tutte le principali tecnologie per diventare uno sviluppatore mobile per iOS.

Java Developer

Java Developer

7
guide
300 ore

I fondamentali per lo sviluppo di applicazioni multi piattaforma con Java.

Java Security Expert

Java Security Expert

5
guide
120 ore

Diventare degli esperti in tema di sicurezza delle applicazioni Java.

Maker

Maker

2
guide
50 ore

Usare Raspberry Pi e Arduino per avvicinarsi al mondo dei Maker e dell’IoT.

NoSQL DB Expert

NoSQL DB Expert

5
guide
200 ore

Le principali guide di HTML.it per diventare un esperto dei database NoSQL.

PHP Cloud Developer

PHP Cloud Developer

7
guide
80 ore

Ecco come i professionisti creano applicazioni per il Cloud con PHP.

PHP Developer

PHP Developer

5
guide
100 ore

Lo sviluppo professionale di applicazioni in PHP alla portata di tutti.

PHP e JavaScript Developer

PHP e JavaScript Developer

6
guide
100 ore

Come sviluppare applicazioni Web dinamiche con PHP e JavaScript.

PHP Framework Expert

PHP Framework Expert

6
guide
120 ore

Realizzare applicazioni per il Web utilizzando i framework PHP.

PHP SysAdmin

PHP SysAdmin

6
guide
80 ore

Creare applicazioni PHP e gestire l’ambiente di sviluppo come un pro.

Sviluppare un eCommerce con PHP

Sviluppare un eCommerce con PHP

5
guide
120 ore

Fare gli eCommerce developer con Magento, Prestashop e WooCommerce.

Web &amp; Mobile Designer

Web & Mobile Designer

5
guide
300 ore

Percorso base per avvicinarsi al web design con un occhio al mobile.

WordPress Developer

WordPress Developer

5
guide
150 ore

Realizzare siti Web e Web application con WordPress a livello professionale.

Ti consigliamo anche

App Java per Android: librerie per ogni esigenza

  • 20 Lezioni
  • Avanzata

Guida pratica su alcune delle più note librerie open source realizzate in Java e scritte per affrontare le più frequenti problematiche nello sviluppo di applicazioni per Android.

  • MongoDB: gestione database con Java
  • Java: confrontare orari e date

Virtual Reality con Android e Google Cardboard

Guida pratica all'implementazione di un'app per Android in grado di sfruttare le funzionalità messe a disposizione per la realtà virtuale.

  • Android Studio 3.3 e promesse mancate
  • Ubuntu Touch OTA-6

Google Play Store apre alle Progressive Web App

Kotlin è il linguaggio di riferimento per Android (per Google)

Android: termine del supporto per le App a 32bit entro il 2021

  • Guide
  • Approfondimenti
  • Script
  • Q&A
  • Software
  • Tutorial
  • Videogiochi
  • Tag Software
  • News
  • Video
  • Forum
  • Chi siamo
  • Pubblicità
  • Contatti
  • Cookie policy
  • Privacy policy
  • Privacy Policy Newsletter
© HTML.it 1997-2019 | Triboo Media – P. IVA 06933670967 | HTML.it è un periodico telematico reg. Trib. Roma n. 309/2008 | 2.10.2