4 votes

Meilleures pratiques de gestion des fragments pour les ListFragments multiples

Je prévois d'avoir 3 listes de fragments dans une seule activité. L'objectif est de sélectionner l'option "parler" dans la première liste, puis de passer à la liste "exécuter" en fonction de ce que vous avez cliqué dans la liste "parler", et enfin, dans la liste "exécuter", en fonction de ce que vous avez cliqué, de passer à la liste "manger" finale. Est-ce que cela doit se faire dans les fragments eux-mêmes (comme je l'ai fait) ou en appelant l'activité pour gérer le transfert de données vers les fragments ?

public class OptionsActivity extends Activity {

    protected TalkFragment talk;
    protected RunFragment run;
    protected EatFragment eat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        talk = new TalkFragment();
        run = new RunFragment();
        eat = new EatFragment();
    } 
}

public class TalkFragment extends ListFragment {
    private Cursor mCursor;
    int mCurCheckPosition = 0;

    @Override
    public void onActivityCreated(Bundle savedState) {
        super.onActivityCreated(savedState);

    }
    @Override
    public void onListItemClick(ListView l, View v, int pos, long id) {
        mCurCheckPosition = pos;
        // We can display everything in-place with fragments.
        // Have the list highlight this item and show the data.
        getListView().setItemChecked(pos, true);

        // Check what fragment is shown, replace if needed.
        RunFragment run_frag = (RunFragment) getFragmentManager().findFragmentById(R.id.fragment_run);
        if (run_frag == null || run_frag.getShownIndex() != pos) {
            run_frag = RunFragment.newInstance(pos);
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.details, details);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }

    } 
}

Ce ne sont évidemment que des bribes, mais vous voyez l'idée. Si je procède de cette manière, je ne sais pas vraiment comment transmettre correctement certains paramètres au fragment. Idéalement, le RunFragment devrait savoir quoi afficher en fonction de l'ID de l'élément cliqué dans le TalkFragment. Ces paramètres devraient-ils plutôt passer par l'activité ?

2voto

Kelly Merrell Points 613

La façon dont je procède généralement est de demander à l'activité d'être l'agent de la circulation pour le traitement des fragments. Votre implémentation onListItemClick pourrait simplement dire à l'Activity ce qu'elle veut faire :

public class OptionsActivity extends Activity {

    protected TalkFragment talk;
    protected RunFragment run;
    protected EatFragment eat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        talk = new TalkFragment();
        run = new RunFragment();
        eat = new EatFragment();
    }

    public void showRunFragment() {
        showFragment(R.id.fragment_run);
    }

    public void showEatFragment() {
        showFragment(R.id.fragment_eat);
    }

    public void showFragment(int fragmentId) {
        // Check what fragment is shown, replace if needed.

        ...
    }
}

public class TalkFragment extends ListFragment {
    private Cursor mCursor;
    int mCurCheckPosition = 0;

    @Override
    public void onActivityCreated(Bundle savedState) {
        super.onActivityCreated(savedState);

    }

    @Override
    public void onListItemClick(ListView l, View v, int pos, long id) {
        mCurCheckPosition = pos;
        // We can display everything in-place with fragments.
        // Have the list highlight this item and show the data.
        getListView().setItemChecked(pos, true);

        getActivity().showRunFragment()
    } 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X