ViewPager mise à jour fragment de balayage
j'ai un problème que j'ai été aux prises avec, pour les 2 derniers jours.
Je suis à la construction d'une application qui utilise ActionBar, ViewPager & FragmentPagerAdapter.
Le code de l'Activité, des Fragments, & FragmentPagerAdapter sont exactement comme ceux qui sont indiqués dans l'android exemple sur http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Le problème, je suis confronté est -- en supposant que j'ai seulement 2 fragments dans le viewPager. lors de la commutation/glisser entre les deux, les fragments ne sont pas d'être mis à jour. onResume n'est pas appelé parce que le viewPager caches un minimum de 1 fragment de chaque côté de l'affiche fragment.
J'ai essayé d'utiliser le onTabSelected de détecter si un fragment est sélectionné, puis démarrer une méthode à partir de ce fragment avec l'aide d'une interface (code ci-dessous).
public void onTabSelected(Tab tab, FragmentTransaction ft) {
TabInfo tag = (TabInfo)tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
((IStartStop)getItem(tab.getPosition())).Start();
}
Toutefois, lorsque la méthode de Démarrage est utilisé d'une NullPointerException est déclenché lorsque vous tentez de mettre à jour un textview. La méthode de démarrage de code est:
public void Start() {
TextView tv = _view.findViewById(R.id.text);
tv.setText("test");
}
L'exception est levée, à la ligne:
TextView tv = _view.findViewById(R.id.text);
La IStartStop interface est assez simple:
public interface IStartStop {
public void Start();
public void Stop();
}
Je ne veux pas utiliser notifyDataSetChanged(); avec POSITION_NONE parce que à chaque fois que je balayez vers un nouveau fragment, il faut quelques secondes pour charger les fragments
À cette époque, les fragments ne présentent qu'un textview, dans l'avenir, ils auront une animation et il est donc important de:
1 - l'exécution d'une animation lorsque le fragment est choisi et non pas lorsque le fragment suivant est sélectionné (la façon ViewPager caches et reprend des fragments).
2 - Arrêter l'animation lorsque le fragment n'est plus sélectionnée pour éviter de gaspiller les ressources du périphérique.
Oui, j'ai déjà tout vérifié sur internet mais rien ne semble fonctionner avec moi.
Merci beaucoup pour votre aide!
Vous devez vous connecter pour publier un commentaire.
Étonnamment, les
ViewPager
ne le faisons pas "nativement" (entre autres choses). Mais tout n'est pas perdu.D'abord, vous devez modifier vos fragments de sorte qu'ils exécuter l'animation lorsque vous leur dites que c'est ok et pas quand ils sont instanciés. De cette façon, vous pouvez jouer avec les viewpager offset (valeur par défaut = 3) et 2 ou 3 fragments préchargé mais pas d'animation.
Deuxième étape consiste à créer une interface ou similaires qui définit le moment où le "fragment est devenu visible".
Troisième étape consisterait à fixer un nouveau OnPageScrollListener à votre viewpager.
Code suivant (en semi-non testé-code):
1) Fixer l'Auditeur:
2) C'est votre Interface:
3) de Modifier vos fragments de sorte qu'ils de mettre en œuvre cette:
4) mettre en Œuvre l'interface dans le fragment
Où aller à partir d'ici?
Que vous souhaitez implémenter une méthode/auditeur de notifier les "autres" fragments qu'ils ne sont plus visibles (c'est à dire lorsque l'on est visible, les autres ne le sont pas). Mais qui peut ne pas être nécessaire.
setOffscreenPageLimit(3)
afin de maintenir les fragments, aucun code ne doit être enonResume()
et l'appel à l'animation doit être fait manuellement. qui est assez similaire à ce que j'ai fait dans mon code:((IStartStop)getItem(tab.getPosition())).Start();
mais l'astuce pour ne pas avoir quoi que ce soit dans onResume pourrait réellement fonctionner. Je vais l'essayer et vous dira Merci!Fragment.instantiate(mContext, info.clss.getName(), info.args)
, cependant, votre méthode a fonctionnéPagerAdapter.instantiateItem(vViewPager, position);
. Aussi, comme dans mon code ci-dessus, toutes les méthodes de formeonResume
&onPause
sont supprimés et sont appelées à partir de laonPageChanged
événement. Je ne peux pas croire que je n'ai même pas soupçonnergetItem()
être à l'origine de tous ces sujets, mais je suppose que c'est ce qui arrive quand les 9 heures de travail par jour et de passer plus de 6 heures de la nuit à essayer de terminer votre travail. Merci!mPagerAdapter.instantiateItem(mViewPager, i);
cette ligne de code de résoudre mon problème.Cela va affecter les modifications d'une page à une autre page en vue de radiomessagerie.
L'utiliser dans votre page de carte.
setOnPageChangeListener a été désapprouvée. Au lieu de cela, vous devez utiliser addOnPageChangeListener.
Ajouter ce code lorsque vous définissez la Viewpager
Il ne sera pas enregistrer n'importe quelle vue de l'fragments lorsque vous passez à autre fragment .. donc passer de l'fragment à l'autre va créer le fragment de la démarrer et de mettre à jour tout.
mViewPager.setOffscreenPageLimit(0)
a une valeur par défaut de 1 et de le jeter et d'exception si la valeur 0 est utilisée.