Supponiamo che tu voglia utilizzare le schede della barra delle azioni come forma principale di navigazione di primo livello nella tua applicazione. Purtroppo, le API ActionBar sono disponibili solo in Android 3.0 o versioni successive (livello API 11+). Pertanto, se vuoi distribuire la tua applicazione su dispositivi con versioni precedenti della piattaforma, devi fornire un'implementazione che supporti le API più recenti e un meccanismo di fallback che utilizzi le API precedenti.
In questa classe, creerai un componente dell'interfaccia utente (UI) a schede che utilizza classi astratte con implementazioni specifiche della versione per fornire la compatibilità con le versioni precedenti. Questa lezione descrive come creare un livello di astrazione per le nuove API delle schede come primo passo verso la creazione del componente delle schede.
Prepararsi per l'astrazione
L'astrazione nel linguaggio di programmazione Java prevede la creazione di una o più interfacce o classi astratte per nascondere i dettagli di implementazione. Nel caso delle API Android più recenti, puoi utilizzare l'astrazione per creare componenti con riconoscimento della versione che utilizzano le API attuali sui dispositivi più recenti e che eseguono il fallback alle API precedenti e più compatibili sui dispositivi meno recenti.
Quando utilizzi questo approccio, devi prima determinare quali classi più recenti vuoi poter utilizzare in modo compatibile con le versioni precedenti, quindi creare classi astratte basate sulle interfacce pubbliche delle classi più recenti. Quando definisci le interfacce di astrazione, devi rispecchiare il più possibile le API più recenti. In questo modo, la compatibilità con le versioni successive è massimizzata e in futuro sarà più facile eliminare il livello di astrazione quando non sarà più necessario.
Dopo aver creato le classi astratte per queste nuove API, è possibile creare e scegliere un numero qualsiasi di implementazioni in fase di runtime. Ai fini della compatibilità con le versioni precedenti, queste implementazioni possono variare in base al livello API richiesto. Pertanto, un'implementazione può utilizzare le API rilasciate di recente, mentre altre possono utilizzare API precedenti.
Creare un'interfaccia di schede astratta
Per creare una versione delle schede compatibile con le versioni precedenti, devi prima determinare le funzionalità e le API specifiche richieste dalla tua applicazione. Nel caso delle schede di sezione di primo livello, supponiamo che tu abbia i seguenti requisiti funzionali:
- Gli indicatori delle schede devono mostrare testo e un'icona.
- Le schede possono essere associate a un'istanza di frammento.
- L'attività deve essere in grado di ascoltare le modifiche delle schede.
La preparazione anticipata di questi requisiti ti consente di controllare l'ambito del livello di astrazione. Ciò significa che puoi dedicare meno tempo alla creazione di più implementazioni del livello di astrazione e iniziare a utilizzare prima la nuova implementazione compatibile con le versioni precedenti.
Le API chiave per le schede si trovano in ActionBar e ActionBar.Tab. Queste sono le API da astrarre per rendere le schede consapevoli della versione. I requisiti di questo progetto di esempio richiedono la compatibilità con Eclair (livello API 5) e l'utilizzo delle nuove funzionalità delle schede in Honeycomb (livello API 11). Di seguito è riportato un diagramma della struttura delle classi per supportare queste due implementazioni e le relative classi base astratte (o interfacce).
Astrare ActionBar.Tab
Inizia a creare il livello di astrazione delle schede creando una classe astratta che rappresenta una scheda, che rispecchia l'interfaccia ActionBar.Tab:
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
Java
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
Qui puoi utilizzare una classe astratta anziché un'interfaccia per semplificare l'implementazione di funzionalità comuni come l'associazione di oggetti scheda alle attività (non mostrata nello snippet di codice).
Metodi delle schede di ActionBar astratti
Quindi, definisci una classe astratta che ti consenta di creare e aggiungere schede a un'attività, come ActionBar.newTab() e ActionBar.addTab():
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
Java
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
Nelle lezioni successive, creerai implementazioni per TabHelper e CompatTab che funzionano sia sulle versioni precedenti che su quelle più recenti della piattaforma.