Compatibilità Android Elenco degli indicatori su Honeycomb

La libreria di compatibilità Android ti ha permesso di aggiungere frammenti all'elenco di tutorial (TutList) per l'utilizzo su dispositivi con Android 1.6 e versioni successive. Tuttavia, non fornisce una perfetta compatibilità. Un punto critico consiste nel fornire un meccanismo per indicare all'utente quale elemento della lista è selezionato e mostrare in un altro frammento, il contesto per i suoi dettagli (vedere il contenuto dell'articolo, in questo caso).

In questa breve esercitazione, estenderemo l'applicazione TutList esistente per fornire questa funzionalità ai dispositivi Honeycomb (Android 3.0 e 3.1) senza compromettere la compatibilità con i dispositivi meno recenti.

Passaggio 0: Introduzione

In questo tutorial si presuppone di iniziare dove sono presenti i concetti fondamentali di Android: notifiche della barra di stato disattivate. Puoi scaricare quel vecchio codice e lavorare da esso, oppure puoi semplicemente scaricare o visualizzare il codice fornito con questo tutorial e seguirlo. La scelta è tua. Questo tutorial è per il codice di versione 10. I tag? la vista del visualizzatore sorgente ha ciascuna versione, per comodità.

Passaggio 1: un semplice tentativo

Se fai un po 'di scavo nelle applicazioni di esempio di Google che illustrano i frammenti, troverai che il codice di esempio utilizza il tipo di elemento di elenco incorporato per l'adattatore, chiamato android.R.layout.simple_list_item_activated_1. Dal momento che stiamo usando il nostro layout personalizzato per la voce dell'elenco, non possiamo usarlo nel nostro esempio. Inoltre, questo layout non è definito prima dell'API di livello 11. Tuttavia, ciò che notiamo è che il codice per il layout ha una semplice aggiunta per supportare l'indicatore: un'impostazione di sfondo.

Semplicemente aggiungendo questo attributo, come mostrato sotto, si ottiene un progetto che non compila più:

  

Perché non verrà compilato? Semplice. Anche l'attributo background è disponibile solo in API Livello 11 e versioni successive. E non puoi semplicemente usare il valore sottostante, neanche. La risorsa a cui fa riferimento l'attributo è StateListDrawable che utilizza un valore di stato di "state_activated" introdotto nell'API Livello 11.

Passaggio 2: correzione della compilazione

Se l'attributo background è disponibile solo su API di livello 11 e superiori, possiamo semplicemente compilare per il livello 11? Proviamolo. Per cambiare rapidamente il livello dell'API con cui si sta compilando, fare clic con il tasto destro del mouse sul progetto, selezionare Proprietà, trovare la sezione Android e modificare Target di costruzione progetto su Android 3.0 (livello API 11).

Compilare. Quindi hai finito? Non ancora. Innanzitutto, prova a eseguirlo su un dispositivo Android 3.0. (Forse eri un partecipante a Google IO e hai una nuova brillante scheda Galaxy 10.1. Provalo su quello!) In secondo luogo, prova a eseguirlo su un dispositivo con livello API 10 o inferiore.

Lo schermo funziona su entrambi i dispositivi? No! Quindi cosa sta succedendo?

Ci sono due problemi: Sui dispositivi Honeycomb, l'indicatore non disegna correttamente. Su dispositivi che eseguono versioni precedenti di Android, l'applicazione si arresta in modo anomalo. Entrambi i problemi sono risolvibili, quindi risolviamo entrambi questi problemi ora.

Passaggio 3: mostra l'indicatore

Ci sono due ragioni che l'indicatore non mostra. La prima ragione è che non stiamo ancora configurando correttamente il ListView, né dicendogli quale elemento di elenco evidenziare. La seconda ragione è che l'attributo che stiamo usando per lo sfondo si basa su nuovi valori trovati all'interno del nuovo tema olografico di Honeycomb.

Per risolvere il primo problema, modifica TutListFragment.java e aggiungi un metodo di override per onActivityCreate () per impostare la modalità di scelta del controllo ListView:

 @Override public void onActivityCreated (Bundle savedInstanceState) super.onActivityCreated (savedInstanceState); . GetListView () setChoiceMode (ListView.CHOICE_MODE_SINGLE); 

Questo dice al controllo ListView che ci sarà una "scelta" o selezione alla volta. Ora, dobbiamo dire a ListView quale oggetto è l'oggetto scelto. Questo viene fatto tramite il metodo setItemChecked () di ListView. Inserire il seguente codice alla fine del metodo onListItemClicked ():

 l.setItemChecked (position, true);

Ora ListView verrà aggiornato in modo appropriato, ma i valori del tema non sono ancora disponibili. Questo perché l'impostazione targetSdkVersion del progetto è impostata su una versione precedente di Android, pertanto viene utilizzato un tema compatibile anziché il nuovo tema Honeycomb. Per risolvere questo problema, modifica l'impostazione targetSdkVersion nel file AndroidManifest.xml da 10 a 11.

Ora esegui nuovamente l'applicazione sul tuo dispositivo Honeycomb (o emulatore). Il tutorial attualmente visualizzato è ora evidenziato in ListView!

Bonus: barra di azione attivata automaticamente

Hai notato qualcosa di nuovo in quell'ultima schermata? Esatto, la barra delle azioni è ora attiva. Semplicemente cambiando il valore targetSdkVersion nel file manifest, ora abbiamo una barra delle azioni. Noterai inoltre che il pulsante del menu delle opzioni non è più visibile. Al suo posto, il menu della barra delle azioni è ora disponibile e contiene le voci del menu delle opzioni (senza icone). Le voci del menu funzionano esattamente come prima.

Passaggio 4: evitare i blocchi sui livelli API precedenti

Prima che tu sia troppo eccitato, non dimentichiamo che l'app si blocca ancora su dispositivi con versioni precedenti di Android SDK, non ottimali. Potresti aver notato diversi passaggi lungo il percorso che suggeriscono una conclusione sfortunata: gli indicatori non funzioneranno su dispositivi precedenti a Honeycomb. Tutti gli attributi che abbiamo usato richiedono Honeycomb, ma non possiamo semplicemente creare le nostre impostazioni? Sfortunatamente no. L'elemento chiave che manca è uno stato "attivato": un nuovo stato di controllo della vista introdotto in Honeycomb per questi tipi di elementi dell'interfaccia utente. (In definitiva, l'attributo background utilizza la funzione selector per selezionare un drawable in base a uno stato particolare. In questo caso, usa state_activated, che è nuovo all'API di livello 11. Gli stati alternativi non vengono modificati nelle precedenti versioni API, per questo uso di ListView.)

Sebbene esistano soluzioni programmatiche a questo problema, dobbiamo comunque assicurarci che l'applicazione non si arresti in modo anomalo semplicemente caricando il layout. Per risolvere questo problema, crea una nuova cartella di layout denominata "layout-v11" e inserisci l'esistente list_item.xml Honeycomb specifico. Quindi crea una copia di list_item.xml e inseriscila nella cartella di layout originale, ma rimuovi la proprietà di background.

Ora abbiamo creato un layout alternativo per Honeycomb e un layout predefinito senza la proprietà di sfondo da utilizzare in altri casi. L'attributo speciale sarà accessibile solo sui dispositivi che utilizzano l'API Livello 11 (e più in alto, in realtà, funziona perfettamente con i dispositivi API Level 12).

Attenzione: ora utilizziamo funzionalità che richiedono la compilazione con API di livello 11. Sebbene questo caso particolare sia semplice, ora non avremo errori del compilatore se proviamo a utilizzare una chiamata che non è disponibile nelle versioni precedenti. Ora è necessaria più attenzione nella scelta delle chiamate al metodo e nei test. Questo è un inconveniente dell'utilizzo di nuove funzionalità pur rimanendo compatibile con livelli API precedenti. In generale, però, spesso vale la pena di fare uno sforzo in più.

Conclusione

In questo breve tutorial hai appreso come indicare agli utenti quale elemento dell'elenco viene selezionato utilizzando una nuova funzione di indicatore disponibile solo su API Livello 11 e versioni successive pur mantenendo la compatibilità con le precedenti versioni di Android SDK. Durante il processo, hai anche imparato come abilitare la barra delle azioni, disponibile in API Livello 11 e successive, mentre impari quanto sia preziosa la selezione di risorse alternative di Android per indirizzare una versione specifica dell'API.

Lasceremo la soluzione programmatica per livelli API più vecchi come esercizio per il lettore. Come indicheresti quale voce di ListView è selezionata negli SDK precedenti?

Riguardo agli Autori

Gli sviluppatori mobili Lauren Darcey e Shane Conder hanno coautore diversi libri sullo sviluppo di Android: un libro di programmazione approfondito intitolato Sviluppo di applicazioni wireless Android e Sams ti insegna a sviluppare applicazioni Android in 24 ore. Quando non scrivono, passano il loro tempo a sviluppare software mobile presso la loro azienda ea fornire servizi di consulenza. Possono essere contattati via email a [email protected], tramite il loro blog su androidbook.blogspot.com e su Twitter @androidwireless.

Hai bisogno di più aiuto nella scrittura di app per Android? Consulta i nostri ultimi libri e risorse!

я я