Crea un'implementazione con API precedenti

Questa lezione spiega come creare un'implementazione che rispecchi le API più recenti che ancora supportano i dispositivi meno recenti.

Scelta di una soluzione sostitutiva

L'attività più impegnativa nell'utilizzare le nuove funzionalità dell'interfaccia utente in modo compatibile con le versioni precedenti è decidere e implementare una soluzione meno recente (di riserva) per le versioni precedenti della piattaforma. In molti casi, è possibile soddisfare lo scopo di questi componenti dell'interfaccia utente più recenti utilizzando le funzionalità del framework UI meno recente. Ecco alcuni esempi:

  • Le barre delle azioni possono essere implementate utilizzando una LinearLayout orizzontale contenente i pulsanti immagine, come barre del titolo personalizzate o come visualizzazioni nel layout delle attività. Le azioni extra possono essere presentate sotto il pulsante Menu del dispositivo.

  • Le schede della barra delle azioni possono essere implementate utilizzando un elemento LinearLayout orizzontale contenente pulsanti oppure utilizzando l'elemento UI TabWidget.

  • I widget NumberPicker e Switch possono essere implementati utilizzando rispettivamente i widget Spinner e ToggleButton.

  • I widget ListPopupWindow e PopupMenu possono essere implementati utilizzando PopupWindow widget.

In genere non esiste una soluzione unica per il backporting dei componenti dell'interfaccia utente più recenti sui dispositivi meno recenti. Fai attenzione all'esperienza utente: sui dispositivi meno recenti, gli utenti potrebbero non avere dimestichezza con i modelli di progettazione e i componenti dell'interfaccia utente più recenti. Pensa a come è possibile offrire la stessa funzionalità utilizzando elementi familiari. In molti casi, questo è un problema meno serio se i componenti dell'interfaccia utente più recenti sono in evidenza nell'ecosistema delle applicazioni (come la barra delle azioni) o se il modello di interazione è estremamente semplice e intuitivo (ad esempio le visualizzazioni di scorrimento utilizzando un ViewPager).

Implementa le schede utilizzando API meno recenti

Per creare un'implementazione precedente delle schede della barra delle azioni, puoi utilizzare TabWidget e TabHost (sebbene sia possibile usare i widget Button disposti orizzontalmente). Implementa questa funzionalità in classi chiamate TabHelperEclair e CompatTabEclair, poiché questa implementazione utilizza API introdotte non oltre Android 2.0 (Eclair).

Diagramma della classe per l'implementazione delle schede in Eclair.

Figura 1. Diagramma della classe per l'implementazione delle schede in Eclair.

L'implementazione CompatTabEclair archivia le proprietà della scheda, come il testo della scheda e l'icona nelle variabili di istanza, poiché non è disponibile un oggetto ActionBar.Tab per gestire questo spazio di archiviazione:

Kotlin

class CompatTabEclair internal constructor(val activity: FragmentActivity, tag: String) :
        CompatTab(tag) {

    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private var text: CharSequence? = null
    ...

    override fun setText(resId: Int): CompatTab {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.resources.getText(resId)
        return this
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

Java

public class CompatTabEclair extends CompatTab {
    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private CharSequence text;
    ...

    public CompatTab setText(int resId) {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.getResources().getText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

L'implementazione TabHelperEclair utilizza i metodi del widget TabHost per creare oggetti TabHost.TabSpec e indicatori di scheda:

Kotlin

class TabHelperEclair internal constructor(activity: FragmentActivity) : TabHelper(activity) {

    private var tabHost: TabHost? = null
    ...

    override fun setUp() {
        // Our activity layout for pre-Honeycomb devices
        // must contain a TabHost.
        tabHost = tabHost ?: mActivity.findViewById<TabHost>(android.R.id.tabhost).apply {
            setup()
        }
    }

    override fun addTab(tab: CompatTab) {
        ...
        tabHost?.newTabSpec(tab.tag)?.run {
            setIndicator(tab.getText()) // And optional icon
            ...
            tabHost?.addTab(this)
        }
    }
    // The other important method, newTab() is part of
    // the base implementation.
}

Java

public class TabHelperEclair extends TabHelper {
    private TabHost tabHost;
    ...

    protected void setUp() {
        if (tabHost == null) {
            // Our activity layout for pre-Honeycomb devices
            // must contain a TabHost.
            tabHost = (TabHost) mActivity.findViewById(
                    android.R.id.tabhost);
            tabHost.setup();
        }
    }

    public void addTab(CompatTab tab) {
        ...
        TabSpec spec = tabHost
                .newTabSpec(tag)
                .setIndicator(tab.getText()); // And optional icon
        ...
        tabHost.addTab(spec);
    }

    // The other important method, newTab() is part of
    // the base implementation.
}

Ora hai due implementazioni di CompatTab e TabHelper: una che funziona sui dispositivi con Android 3.0 o versioni successive e utilizza nuove API, mentre un'altra che funziona sui dispositivi con Android 2.0 o versioni successive e utilizza API meno recenti. La lezione successiva illustra l'utilizzo di queste implementazioni nell'applicazione.