Padrões de design úteis para trabalhar com o FragmentManager no Android


10

Ao trabalhar com fragmentos, uso uma classe composta por métodos estáticos que definem ações em fragmentos. Para qualquer projeto, posso ter uma classe chamada FragmentActions, que contém métodos semelhantes ao seguinte:

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

Normalmente, terei um método por tela de aplicativo. Faço algo assim quando trabalho com pequenos bancos de dados locais (geralmente SQLite), então apliquei-o a fragmentos, que parecem ter um fluxo de trabalho semelhante; Eu não sou casado com isso, no entanto.

Como você organizou seus aplicativos para interagir com a API Fragments e quais padrões de design (se houver) você acha que se aplicam?


11
Por que você tem uma classe responsável por mostrar todo tipo de fragmento? Não deveria ser um método estático dentro da classe Fragment dentro?
Piotr

Respostas:


3

O padrão aceito é ter um método de fábrica dentro da sua classe de fragmento personalizada (normalmente chamada newInstance (), mas ei a opção do revendedor). Portanto, sua classe de fragmento deve se parecer com isso:

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

Então, quando você cria um fragmento e o adiciona ao backstack, em vez de dizer:

Fragmento MyFragment = novo MyFragment ();

Você pode usar o método de fábrica em vez da palavra-chave 'nova'.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.