2013-02-17 5 views
3

J'essaye de créer une configuration de double volet/volet unique pour une application. Cela a bien fonctionné il y a un moment avant que je mette tout le contenu dans les fragments, et je ne sais pas ce qui l'a empêché de fonctionner. Le problème se produit lorsque je fais un changement d'orientation. Au début, il ne recréait pas la vue pour une raison quelconque. Il appelait surCreateView, mais je n'étais pas en mesure d'obtenir un contrôle sur la listview à l'intérieur de la vue et obtenait null (je sais que les mises en page sont correctes pour le paysage et le portrait, car cela fonctionne à la fois). Donc, ce que j'ai fait est d'ajouter setRetainInstance à true, en pensant que cela réglerait mon problème. Eh bien, cela a soulevé toute une autre question de maintenant, je reçois No View Found For Id. Ce que je pense qu'il se passe maintenant, c'est qu'il essaie de se reconnecter à l'ID qu'il avait avant le changement d'orientation, et il n'existe pas comme sur une autre mise en page maintenant. J'ai essayé juste de créer un nouveau fragment et de l'ajouter, mais cela ne fonctionne pas non plus. Je suis en train de tirer mes cheveux en essayant de travailler avec le système de fragments de pensée d'Android qui est presque impossible de travailler avec. Toute aide serait appréciée. Voici le code correspondantFragment Android Aucune vue Trouvé pour l'ID

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.study_guide); 
    //Create The Ad Service 

    //Check to see if the view is landscape or portrait 
    if (this.findViewById(R.id.singlePaneStudyGuide) != null) { 
     mDualPane = false; 
    } else if (this.findViewById(R.id.doublePaneStudyGuide) != null) { 
     mDualPane = true; 
    } 
    LinearLayout layout = (LinearLayout)findViewById(R.id.addbox); 
    adView = new AdView(this,AdSize.SMART_BANNER,"a1511f0352b42bb"); 
    layout.addView(adView); 
    AdRequest r = new AdRequest(); 
    r.setTesting(true); 
    adView.loadAd(r); 



    //Inflate Fragments depending on which is selected 
    //if (savedInstanceState == null) { 
     FragmentManager fm = this.getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     SGListFragment newFrag = new SGListFragment(); 

     if (mDualPane == true) { 
      ft.add(R.id.sgScrollContainer, newFrag, "SgListView").commit(); 
     } else { 
      ft.add(R.id.singlePaneStudyGuide, newFrag, "SgListView").commit(); 

     } 
     fm.executePendingTransactions(); 
    //} 
} 

Ive essayé de chercher le fragment avec le gestionnaire de fragment et réaffectant à une autre mise en page, mais pour une raison quelconque le toujours à la recherche de l'ancien.

+1

s'il vous plaît envoyer votre code – Kerry

+0

s'il vous plaît également ajouter le contenu de study_guide.xml pour les orientations portrait et paysage –

Répondre

2

Vous réécrire votre code comme suit:

//Inflate Fragments depending on which is selected 
    //if (savedInstanceState == null) { 
    FragmentManager fm = this.getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    // here the trick starts 
    int oldId = (mDualPane == true) ? R.id.singlePaneStudyGuide 
            : R.id.sgScrollContainer; 
    Fragment oldFragment = fm.findFragmentById(oldId); 
    if(null != oldFragment){ 
     ft.remove(oldFragment); 
     ft.commit(); 
     fm.executePendingTransactions(); 
     ft = fragmentManager.beginTransaction(); 
    } 
    // end of tricks 
    SGListFragment newFrag = new SGListFragment(); 

    if (mDualPane == true) { 
     ft.add(R.id.sgScrollContainer, newFrag, "SgListView").commit(); 
    } else { 
     ft.add(R.id.singlePaneStudyGuide, newFrag, "SgListView").commit(); 

    } 
+0

j'ai réussi à le fixer à l'aide findView au lieu de getActivity () .findViewById du côté du fragment. J'essaierai ceci cette semaine pour voir si cela fonctionne mieux. En ce moment, quand je change d'orientation, elle perd son emplacement et commence un nouveau fragment au lieu de l'ancien. Donc, je vais donner un coup de feu et vous le faire savoir. Merci – Shaun

+0

Pour laisser fragment pour survivre lors de la modification de la configuration, essayez setRetainInstance (true) (http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)). En outre, regardez ici pour plus d'informations concernant le cycle de vie du fragment: http://marakana.com/s/post/1250/android_fragments_tutorial –

+0

Ouais, le setRetainInstance (true) provoque toujours un FC. Sa recherche de la vue qu'elle était à l'origine, pas le nouveau ... – Shaun

Questions connexes