Manière indéréglable de gérer le fragment lors du changement d’orientation

public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); // add menu fragment MainMenuFragment myFragment = new MainMenuFragment(); fragmentTransaction.add(R.id.menu_fragment, myFragment); //add content DetailPart1 content1= new DetailPart1 (); fragmentTransaction.add(R.id.content_fragment, content1); fragmentTransaction.commit(); } public void onMainMenuSelected(Ssortingng tag) { //next menu is selected replace existing fragment } 

J’ai besoin d’afficher deux vues de liste côte à côte, le menu à gauche et son contenu à droite. Par défaut, le premier menu est sélectionné et son contenu est affiché à droite. Le fragment qui affiche le contenu est comme ci-dessous

 public class DetailPart1 extends Fragment { ArrayList<HashMap> myList = new ArrayList<HashMap>(); ListAdapter adap; ListView listview; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(savedInstanceState!=null){ myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj"); adap = new LoadImageFromArrayListAdapter(getActivity(),myList ); listview.setAdapter(adap); }else{ //get list and load in list view getlistTask = new GetALLListTasks().execute(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.skyview_fragment, container,false); return v; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("MYLIST_obj", myList ); } } 

OnActivityCreated et onCreateView sont appelés deux fois , il y a beaucoup d’exemples utilisant des fragments, donc je suis débutant dans ce segment, je ne peux pas relier l’exemple avec mon problème. Non déclaré Android: configChanges dans le fichier manifeste, j’ai besoin de l’activité détruire et recréer de sorte que je puisse utiliser la mise en page différente en mode paysage.S’il vous plaît aide à une solution de contournement

    Vous créez un nouveau fragment à chaque fois que vous activez l’écran de votre activité onCreate(); Mais vous conservez également les anciens avec super.onCreate(savedInstanceState); . Donc, peut-être définir le tag et trouver le fragment s’il existe, ou passer le bundle null à super.

    Cela m’a pris du temps à apprendre et ça peut vraiment être un bi **** quand vous travaillez avec des choses comme viewpager.

    Je vous recommande de lire à propos des fragments une heure supplémentaire car ce sujet précis est couvert.

    Voici un exemple de la façon de gérer des fragments lors d’un changement d’orientation régulier:

    Activité :

     public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { TestFragment test = new TestFragment(); test.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit(); } else { TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag"); } } } 

    Fragment :

     public class TestFragment extends Fragment { public static final Ssortingng KEY_ITEM = "unique_key"; public static final Ssortingng KEY_INDEX = "index_key"; private Ssortingng mTime; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); if (savedInstanceState != null) { // Restore last state mTime = savedInstanceState.getSsortingng("time_key"); } else { mTime = "" + Calendar.getInstance().getTimeInMillis(); } TextView title = (TextView) view.findViewById(R.id.fragment_test); title.setText(mTime); return view; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSsortingng("time_key", mTime); } } 

    Une bonne directive sur la façon de conserver les données entre les changements d’orientation et les activités récréatives peut être trouvée dans les directives Android .

    Résumé:

    1. rendre votre fragment conservable:

       setRetainInstance(true); 
    2. Créer un nouveau fragment uniquement si nécessaire (ou du moins en prendre des données)

       dataFragment = (DataFragment) fm.findFragmentByTag("data"); // create the fragment and data the first time if (dataFragment == null) {