Nützliche Entwurfsmuster für die Arbeit mit FragmentManager unter Android

10

Bei der Arbeit mit Fragmenten habe ich eine Klasse verwendet, die aus statischen Methoden besteht, die Aktionen für Fragmente definieren. Für jedes Projekt habe ich möglicherweise eine Klasse namens FragmentActions, die ähnliche Methoden enthält:

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();
}

Normalerweise habe ich eine Methode pro Anwendungsbildschirm. Ich mache so etwas, wenn ich mit kleinen lokalen Datenbanken (normalerweise SQLite) arbeite, also habe ich es auf Fragmente angewendet, die einen ähnlichen Workflow zu haben scheinen. Ich bin aber nicht damit verheiratet.

Wie haben Sie Ihre Anwendungen für die Schnittstelle mit der Fragment-API organisiert und welche (falls vorhanden) Entwurfsmuster gelten Ihrer Meinung nach dafür?

Anthony Naddeo
quelle
1
Warum haben Sie eine Klasse, die für die Anzeige aller Arten von Fragmenten verantwortlich ist? Sollte es nicht eine statische Methode innerhalb der Fragment-Klasse sein?
Piotr

Antworten:

3

Das akzeptierte Muster besteht darin, eine Factory-Methode in Ihrer benutzerdefinierten Fragmentklasse zu haben (normalerweise newInstance () genannt, aber nach Wahl des Händlers). Ihre Fragmentklasse sollte also ungefähr so ​​aussehen:

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...
}

Wenn Sie dann ein Fragment erstellen und es dem Backstack hinzufügen, anstatt zu sagen:

MyFragment fragment = new MyFragment ();

Sie können die Factory-Methode anstelle des Schlüsselworts 'new' verwenden.

Leeran7742
quelle