14 votes

Approche par fragments imbriqués d'Android

Je suis un débutant dans l'utilisation des fragments d'Android, j'ai un scénario.

  1. Activité principale qui s'étend FragmentActivity Mon activité principale consiste en deux Fragments
  2. Liste des options qui s'étendent Fragment
  3. Détails Liste qui s'étend Fragment
  4. Description détaillée qui étend Fragment

Lorsque je lance mon activité principale . Elle consistera en une liste d'options dans Fragment 1 & Détails Liste en Fragment 2 . Ensuite, je sélectionne un élément dans la liste des détails. Ensuite, sa description doit être chargée dans Fragment 2 de l'activité principale

Voir cette image

enter image description here

Je n'ai pas d'idée sur la façon de réaliser cela. Je veux dire comment puis-je dire au fragment Liste de détails de charger le fragment Description de détails dans l'activité principale. De plus, lorsque j'appuie sur le bouton Retour, je dois revenir à l'étape initiale, c'est-à-dire à l'activité principale.

enter image description here

EDIT :

Ce que j'ai fait, c'est créer une interface (Listener) à l'intérieur des fragments et l'implémenter sur mon activité parent. Mais s'il y a 10 fragments différents, je dois implémenter toutes les interfaces dans mon activité mère. Alors, existe-t-il une autre approche pour y parvenir ?

4voto

jfs Points 13605

Ce qu'il faut toujours garder à l'esprit lorsqu'on développe des fragments, c'est qu'ils ont besoin d'une interface utilisateur pour pouvoir être affichés. Vous avez besoin d'un endroit dans votre mise en page où vous voulez que le fragment soit. Il y a deux façons de faire cela :

  • Créez une classe de fragments et déclarez-les dans votre mise en page comme ci-dessous.

    Nous supposons ici que nous avons créé un fragment ArticleListFragment et un fragment ArticleReaderFragment.

    <fragment
        android:id="@+id/list"
        android:name="com.example.news.ArticleListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    
    <fragment
        android:id="@+id/viewer"
        android:name="com.example.news.ArticleReaderFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

    L'inconvénient de cette méthode est que vous ne pouvez pas la modifier au moment de l'exécution, ce qui signifie que lorsque votre application s'exécute, vous ne pouvez pas remplacer un fragment par un autre. Si vous devez afficher deux fragments par exemple, vous devez en déclarer deux dans votre layout et en cacher un ou l'autre. Heureusement, il existe un autre moyen.

  • Ajout programmé de votre fragment au moment de l'exécution. Dans cette approche, vous devez d'abord déclarer un layout et vous assurer d'ajouter un conteneur (LinearLayout, RelativeLayout, etc.) où vous placerez le fragment. Par exemple :

    <ListView
        android:id="@id/options_list"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" >
    </ListView>
    
    <LinearLayout
        android:id="@id/detail_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:orientation="vertical" >
    </LinearLayout>

Ici je définis une liste options_list pour vos options et un layout detail_layout où vous devez mettre les détails. Maintenant, au moment de l'exécution, lorsqu'une option est cliquée, vous affichez le fragment de détails sur detail_layout comme suit :

ExampleFragment fragment = new ExampleFragment();
getFragmentManager().beginTransaction().add(R.id.detail_layout, fragment).commit();

Pour remplacer ce fragment par un autre :

Fragment newFragment = new AnotherExampleFragment();
getFragmentManager().beginTransaction().replace(R.id.detail_layout, newFragment).addToBackStack(null).commit();

Remarquez l'appel à addToBackStack. Il est nécessaire pour que, lorsque l'utilisateur appuie sur Retour, la pile précédente s'affiche.

Je pense que vous pouvez le comprendre à partir d'ici. :)

0voto

Jörn Buitink Points 2118

Dans votre activité de fragment, vous pouvez utiliser 2 vues de contenu (2 Linearlayouts par exemple) - pour votre navigation de gauche (liste d'options) et votre contenu de droite. Vous avez alors besoin d'une fonction publique comme public void switchFragmentInContainer(Fragment f, int position) dans laquelle vous chargez un nouveau fragment dans votre conteneur...

Dans votre OptionList, vous appelez cette fonction comme suit ((FragmentActivity) getActivity).switchFragmentInContainer(NEWFRAGMENT, FragmentActivity.RIGHT); .

J'espère que c'est ce que vous avez cherché.

0voto

Larry McKenzie Points 1852

Según http://developer.Android.com/guide/components/fragments.html#Adding

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

Vous pouvez également avoir besoin :

public class MainActivity extends FragmentActivity {
    ...
    public void onArticleSelected(Uri articleuri) {
        //use data to add the new fragment
    }
    ...
} 

public static class FragmentA extends ListFragment {
    OnArticleSelectedListener mListener;

    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    ...

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Append the clicked item's row ID with the content provider Uri
        Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
        // Send the event and Uri to the host activity
        mListener.onArticleSelected(noteUri);
    }
    ...
}

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