Modelli di progettazione utili per lavorare con FragmentManager su Android


10

Quando lavoro con i frammenti, ho usato una classe composta da metodi statici che definiscono le azioni sui frammenti. Per ogni dato progetto, potrei avere una classe chiamata FragmentActions, che contiene metodi simili ai seguenti:

public static void showDeviceFragment(FragmentManager man){
    String tag = AllDevicesFragment.getFragmentTag();

    AllDevicesFragment fragment = (AllDevicesFragment)man.findFragmentByTag(tag);

    if(fragment == null){
        fragment = new AllDevicesFragment();
    }

    FragmentTransaction t = man.beginTransaction();
    t.add(R.id.main_frame, fragment, tag);

    t.commit();
}

Di solito ho un metodo per schermata dell'applicazione. Faccio qualcosa del genere quando lavoro con piccoli database locali (di solito SQLite), quindi l'ho applicato ai frammenti, che sembrano avere un flusso di lavoro simile; Non ci sono sposato però.

In che modo hai organizzato le tue applicazioni in modo da interfacciarle con l'API Fragments e quali (se presenti) modelli di progettazione ritieni siano applicabili?


1
Perché hai una classe responsabile per mostrare tutti i tipi di frammento? Non dovrebbe essere un metodo statico all'interno della classe Fragment all'interno?
Piotr

Risposte:


3

Il modello accettato è di avere un metodo factory all'interno della classe del frammento personalizzato (in genere chiamato newInstance () ma hey scelta del rivenditore). Quindi la tua classe di frammenti dovrebbe assomigliare a questa:

public class MyFragment extends Fragment
{
    public static MyFragment newInstance()
    {
        MyFragment newFragment = new MyFragment();
        // add any bundle arguments here if needed
        return newFragment;
    }
    // rest of fragment class...
}

Quindi, quando crei un frammento e lo aggiungi allo zaino, invece di dire:

MyFragment fragment = new MyFragment ();

È possibile utilizzare il metodo factory anziché la parola chiave "new".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.