IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Passage FragmentList / Fragment


Sujet :

Android

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut Passage FragmentList / Fragment
    Bonjour,

    Je fais une appli basée sur les fragments en mode paysage, et une simple liste en mode portrait.

    Mon problème est qu'elles interagissent mal entre elles :
    - si on fait une sélection en mode portrait puis qu'on passe en pysage, le contenu s'affiche en plein sans s'occuper du fragment, puis se raffiche normalement en repassant en portrait.
    - si on sélectionne et affiche dans le fragment en paysage, en passant en portrait la sélection n'est plus effective.

    J'ai essayé de chercher, mais je n'ai pas trouvé de réponses vraiment fonctionnelle, et je tourne en rond là ...

    D'avance merci !

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Code ?

    La divination n'est pas encore hélas ma tasse de thé....

    En général il y a 2 fragments:

    FragmentDetails
    FragmentList

    Il y a ensuite deux activités:
    Une activité "Liste" (qui fait FragmentList+FragmentDetails en mode landscape, et FragmentList tout court en mode portrait). Au click, et en mode portrait, elle doit démarrer la seconde activité:
    Une activité "Details" (qui fait FragmentDetails en mode portrait)... A la reception d'un changement en mode "landscape", celle-ci doit retourner à l'activité liste (démarrer l'activité liste, et se fermer)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Bonjour,

    Je n'ai pas mis le code parce que c'est le code de base fourni par google (+ petit ajout pour le contenu perso) pour gérer les fragments.

    Merci pour ton aide en tout cas !
    Je début sur Android, et j'ai un peu de mal sur certains trucs, mais bon j'ai déjà de bonnes bases en java au moins ^^

    ItemDetailActivity.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package com.dwiimdev.forumisfa2012;
     
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.NavUtils;
    import android.view.MenuItem;
     
    public class ItemDetailActivity extends FragmentActivity {
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
     
            getActionBar().setDisplayHomeAsUpEnabled(true);
     
        	/* Pour avoir le bon contenu par page */
            String curPage = getIntent().getStringExtra(ItemDetailFragment.ARG_ITEM_ID);
            if(curPage.equals("1")) {
               setTitle(R.string.title_detail1);
               setContentView(R.layout.activity_item_detail1);
            } else if (curPage.equals("2")) {
                setTitle(R.string.title_detail2);
                setContentView(R.layout.activity_item_detail2);
            } else if (curPage.equals("3")) {
                setTitle(R.string.title_detail3);
                setContentView(R.layout.activity_item_detail3);
            } else if (curPage.equals("4")) {
                setTitle(R.string.title_detail4);
                setContentView(R.layout.activity_item_detail4);
            } else {
                setTitle(R.string.title_detail5);
                setContentView(R.layout.activity_item_detail5);
            }
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                NavUtils.navigateUpTo(this, new Intent(this, ItemListActivity.class));
                return true;
            }
     
            return super.onOptionsItemSelected(item);
        }
    }
    ItemDetailFragment.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    package com.dwiimdev.forumisfa2012;
     
    import com.dwiimdev.forumisfa2012.dummy.DummyContent;
     
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
     
    public class ItemDetailFragment extends Fragment {
     
        public static final String ARG_ITEM_ID = "item_id";
     
        DummyContent.DummyItem mItem;
     
        public ItemDetailFragment() {
        }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments().containsKey(ARG_ITEM_ID)) {
                mItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
            }
        }
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
           /* Pour avoir le bon contenu par page */
            String curPage = getArguments().getString(ARG_ITEM_ID);
            View rootView;
            if(curPage.equals("1")) {
            	rootView=inflater.inflate(R.layout.fragment_item_detail1, container, false);
            } else if (curPage.equals("2")) {
            	rootView=inflater.inflate(R.layout.fragment_item_detail2, container, false);
            } else if (curPage.equals("3")) {
            	rootView=inflater.inflate(R.layout.fragment_item_detail3, container, false);
            } else if (curPage.equals("4")) {
            	rootView=inflater.inflate(R.layout.fragment_item_detail4, container, false);
            } else {
            	rootView=inflater.inflate(R.layout.fragment_item_detail5, container, false);
            }
            return rootView;
        }
    }
    ItemListActivity.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    package com.dwiimdev.forumisfa2012;
     
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.NavUtils;
    import android.view.MenuItem;
     
    public class ItemListActivity extends FragmentActivity
            implements ItemListFragment.Callbacks {
     
        private boolean mTwoPane;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_item_list);
     
            if (findViewById(R.id.item_detail_container) != null) {
                mTwoPane = true;
                ((ItemListFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.item_list))
                        .setActivateOnItemClick(true);
            }
        }
     
        @Override
        public void onItemSelected(String id) {
            if (mTwoPane) {
                Bundle arguments = new Bundle();
                arguments.putString(ItemDetailFragment.ARG_ITEM_ID, id);
                ItemDetailFragment fragment = new ItemDetailFragment();
                fragment.setArguments(arguments);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, fragment)
                        .commit();
     
            } else {
                Intent detailIntent = new Intent(this, ItemDetailActivity.class);
                detailIntent.putExtra(ItemDetailFragment.ARG_ITEM_ID, id);
                startActivity(detailIntent);
            }
        }
    }
    ItemListFragment.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    package com.dwiimdev.forumisfa2012;
     
    import com.dwiimdev.forumisfa2012.dummy.DummyContent;
     
    import android.R;
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.app.ListFragment;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
     
    public class ItemListFragment extends ListFragment {
     
        private static final String STATE_ACTIVATED_POSITION = "activated_position";
     
        private Callbacks mCallbacks = sDummyCallbacks;
        private int mActivatedPosition = ListView.INVALID_POSITION;
     
        public interface Callbacks {
     
            public void onItemSelected(String id);
        }
     
        private static Callbacks sDummyCallbacks = new Callbacks() {
            @Override
            public void onItemSelected(String id) {
            }
        };
     
        public ItemListFragment() {
        }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
                    R.layout.simple_list_item_activated_1,
                    R.id.text1,
                    DummyContent.ITEMS));
        }
     
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            if (savedInstanceState != null && savedInstanceState
                    .containsKey(STATE_ACTIVATED_POSITION)) {
                setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
            }
        }
     
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            if (!(activity instanceof Callbacks)) {
                throw new IllegalStateException("Activity must implement fragment's callbacks.");
            }
     
            mCallbacks = (Callbacks) activity;
        }
     
        @Override
        public void onDetach() {
            super.onDetach();
            mCallbacks = sDummyCallbacks;
        }
     
        @Override
        public void onListItemClick(ListView listView, View view, int position, long id) {
            super.onListItemClick(listView, view, position, id);
            mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
        }
     
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            if (mActivatedPosition != ListView.INVALID_POSITION) {
                outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
            }
        }
     
        public void setActivateOnItemClick(boolean activateOnItemClick) {
            getListView().setChoiceMode(activateOnItemClick
                    ? ListView.CHOICE_MODE_SINGLE
                    : ListView.CHOICE_MODE_NONE);
        }
     
        public void setActivatedPosition(int position) {
            if (position == ListView.INVALID_POSITION) {
                getListView().setItemChecked(mActivatedPosition, false);
            } else {
                getListView().setItemChecked(position, true);
            }
     
            mActivatedPosition = position;
        }
    }
    dummy/DummyContent.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package com.dwiimdev.forumisfa2012.dummy;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    public class DummyContent {
     
        public static class DummyItem {
     
            public String id;
            public String content;
     
            public DummyItem(String id, String content) {
                this.id = id;
                this.content = content;
            }
     
            @Override
            public String toString() {
                return content;
            }
        }
     
        public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
        public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
     
        /* Ici je def le contenu de mon menu */
        static {
        	addItem(new DummyItem("1", "Présentation"));
            addItem(new DummyItem("2", "Conférences"));
            addItem(new DummyItem("3", "Stands"));
            addItem(new DummyItem("4", "Partenaires"));
            addItem(new DummyItem("5", "Accès et contacts"));
        }
     
        private static void addItem(DummyItem item) {
            ITEMS.add(item);
            ITEM_MAP.put(item.id, item);
        }
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Il manque justement la gestion des modes d'orientation dans le ItemDetails Activity.... IL FAUT fermer l'activité si celle-ci passe en mode landscape.

    Je met ici la logique en pseudo-code (à implémenter en vrai-code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    ItemListActivity.onCreate() {
      setContentView(...);   // android selectionne le "bon" layout... en fonction de l'orientation
      ItemListFragment.create();
      if (layout.details in view)  {
          // on est en mode landscape
          this.inDualPane = true;
          ItemDetailsFragment.create();
      }
    }
     
    ItemListActivity.onItemSelected() {
       if (this.inDualPane) {
           // affichage the l'item
       } else {
           Intent i = new Intent(ItemDetailsActivity.class,this);
           i.setExtra(...);
           startActivity(i);
       }
    }
     
     
    ItemDetailsActivity.onCreate() {
      setContentView(...); // portrait only
      ItemDetailsFragment.create();
    }
     
    ItemDetailsActivity.onOrientationChange() {
      if (orientation == portrait) 
         finish(); // on "retourne" à l'activité ItemListActivity
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Après test, cela ne fonctionne qu'en mettant le code de fin dans le onCreate.
    Merci beaucoup !

    Ps : je vais tenter de sauvegarder l'item sélectionné maintenant ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage de extend Activity à Fragment
    Par gisclace dans le forum Android
    Réponses: 1
    Dernier message: 06/05/2015, 10h12
  2. Passage d'objet entre fragment
    Par alex8276 dans le forum Android
    Réponses: 2
    Dernier message: 18/11/2014, 14h41
  3. Réponses: 6
    Dernier message: 16/04/2014, 23h13
  4. fragment shader: passage en n&b
    Par nikhun dans le forum OpenGL
    Réponses: 15
    Dernier message: 25/09/2006, 08h40
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo