2013-04-18 4 views
1

Je suit l'exemple FragmentTabsPager sous les échantillons de ActionBarSherlock.Fragment Voir dans les FragmentPagerAdapter dans SherlockFragmentActivity

Dans mon cas, j'ai créé un SherlockActivity simple avec le TabsPager et le même code de l'exemple pour le FragmentPagerAdapter. J'ai créé deux fragments (classes différentes). Le premier contient seulement quatre boutons. En fonction de ce qui est cliqué, l'activité principale obtient un code (par exemple 1,2,3,4). Je reçois correctement le code pour le bouton pressé.

Maintenant, dans le deuxième fragment que je veux dessiner quelque chose en fonction de ce code, ou ce qui est le même, mettre à jour dynamiquement sa vue.

On m'a cherché une solution mais je n'ai rien. Dans ce cas, j'ai ceci:

[MainActivity.java]

 public static class TabsAdapter extends FragmentPagerAdapter 
      implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { 

private final Context mContext; 
     private final TabHost mTabHost; 
     private final ViewPager mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();  
[...] 
    @Override 
     public Fragment getItem(int position) { 
      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(mContext, info.clss.getName(), info.args); 

    } 

j'ai réussi à mettre à jour le Bundle info.args avec la nouvelle valeur, mais je ne pas savoir comment passer au fragment correctement et commandez-le pour mettre à jour sa vue dynamique.

Est-ce possible?

Merci d'avance.

MISE À JOUR

Enfin, je ce Ensoleillé gentiment expliqué. J'ai gardé un SparseArray avec mes fragments pour que je puisse y accéder sans aucun doute que je connais sa position à l'intérieur MainActivity:

[MainActivity.java]

//Once the user presses the button on the first fragment, the callback calls 
// this function 
    public void onImageSelected(int iNumber){ 

    MySecondFragment msf = (MySecondFragment)mTabsAdapter.getFragment(POS_1); 

     if(msf != null){ 

       msf.setNumImage(iNumber);    
       msf.updateView();         
      }     
     } 

Et enfin MySecondFragment.java je peux accéder à mes composants de mise en page (par exemple un GridView), comme ils ont été initialisés pendant onCreateView, donc j'ai mis tout le code dont j'avais besoin dans ma méthode updateView().

Par exemple, mettre à jour le contenu d'un GridView:

[MySecondFragment.java]

myGridView.setBackground(getResources().getDrawable(iCode)); 

HTH

MISE À JOUR 2

J'ai inclus le code suivant afin de sauvegarder les fragments dans le faisceau d'état de l'activité principale.Lorsque l'application change du mode portrait au paysage ou vice-versa (il est recréée) la fonction getItem ne sont pas appelés, de sorte que le SparseArray carte ne réapprovisionné à nouveau avec les fragments nécessaires:

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putString(CURRENT_TAB, mTabHost.getCurrentTabTag()); 

     getSupportFragmentManager().putFragment(outState, MyFirstFragment.class.getName(), mTabsAdapter.getFragment(POS_1)); 

     getSupportFragmentManager().putFragment(outState, MySecondFragment.class.getName(), 
       mTabsAdapter.getFragment(POS_2)); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     if (savedInstanceState != null) { 

      MyFirstFragment mff = (MyFirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, MyFirstFragment.class.getName());       

      if(mff != null) 
       mTabsAdapter.setFragment(POS_1, mff); 

      MySecondFragment msf = (MySecondFragment) getSupportFragmentManager().getFragment(
        savedInstanceState, MySecondFragment.class.getName());       

      if(msf != null) 
       mTabsAdapter.setFragment(POS_2, msf); 

      mTabHost.setCurrentTabByTag(savedInstanceState 
        .getString(CURRENT_TAB));   
     } 
    } 

En outre, à l'intérieur la classe TabsAdapter:

public Fragment getFragment(int pos) { 
    return map.get(pos); 
} 

public void setFragment (int position, Fragment fragment) { 
    map.put(position, fragment); 
} 

HTH

Répondre

1

anhanniballake réponse pourrait fonctionner. Mais cela pourrait casser à l'avenir.

Pour obtenir effectivement le fragment, vous pouvez définir un sparesArray dans votre classe TabAdapter

private SparseArray<Fragment> map; 

et ajoutez vos fragments dans ce tableau

@Override 
public Fragment getItem(int position) { 
    TabInfo info = mTabs.get(position); 
    Fragment fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    map.put(position, fragment); 
    return fragment; 
} 

Vous devez également retirer le fragment de carte lorsque fragment get destroy

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    map.remove(position); 
    super.destroyItem(container, position, object); 
} 

Définissez maintenant une méthode publique dans la classe TabAdapter w UEL peut obtenir des fragments

public Fragment getFragment(int pos) { 
    return map.get(pos); 
} 

maintenant dans votre principale SherlockFragementActivity vous pouvez obtenir l'instance de tout fragment

MyFragment f = (MyFragment) mTabsAdapter.getFragment(1); // 1 means second fragment from left 

appeler maintenant une méthode dans vos fragments en utilisant l'exemple de fragment que vous avez ci-dessus

f.doAnyThingInMySecondFragment(); 

doAnyThingInMySecondFragment doit être déclaré public :)

+1

Lorsque je change l'orient En effet, ni l'élément destroyItem ni l'élément getItem ne sont appelés, de sorte que le fragment SparseArray n'est pas rechargé lorsque l'activité est recréée. J'ai aussi essayé avec FragmentStatePagerAdapter sans chance. "Que pouvais-je faire?" – aloplop85

+0

lors de la rotation de votre appareil, la méthode 'onStylockActvity'' onCreate' est appelée et dans la méthode' onCreate', votre tabAdapter est initialisé à nouveau. Donc votre sparesArray ne devrait pas être nul. et vous devriez utiliser 'FragmentStatePagerAdapter'. – Sunny

+0

Le tabAdapter est initialisé correctement et SparseArray n'est pas nul. Toutefois, comme getItem n'est pas appelé à nouveau, les fragments ne sont pas inclus dans ce tableau (c'est-à-dire que la taille de SparseArray est 0). – aloplop85

2

le source for FragmentPagerAdapter montre que les fragments sont donnés la balise suivante:

"android:switcher:" + viewId + ":" + id; 

viewId est le R.id de votre ViewPager et id est le numéro de page.

vous pouvez donc récupérer Fragment de la deuxième page en utilisant:

activity.getSupportFragmentManager().findFragmentByTag(
    "android:switcher:" + pager.getId() + ":2") 

pager est votre ViewPager. Vous voudriez alors lancer ce Fragment retourné à n'importe quelle classe spécifique, puis appeler une méthode pour transmettre les informations dont vous avez besoin.

Questions connexes