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
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
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
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