Comment faire pour obtenir l'instance de la actuellement visible fragment dans ViewPager:
Je suis en train de construire une application qui montre les différents fragments dans une ViewPager
. - Je ajouter ces fragments pour la ViewPager
comme ceci:
public void intialiseViewPager()
{
List<Fragment> fragments = new Vector<Fragment>();
numberOfTabs = application.currentReport.getODTabsList().size();
for (int i = 0; i < numberOfTabs; i++)
{
ODTab tempTab = application.currentReport.getODTabsList().get(i);
if (tempTab.getTabType().equals(ODGrid.XML_GRID_ELEMENT))
{
GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId());
fragments.add(gridFragment);
}
else if (tempTab.getTabType().equals(ODChart.XML_CHART_ELEMENT))
{
NewChartFragment chartFragment = NewChartFragment.newInstance(tempTab.getTabId());
fragments.add(chartFragment);
}
}
Log.d(TAG, "Current report fragments set to adapter: "+fragments.toString());
mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments);
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(0);
mViewPager.setOnPageChangeListener(this);
}
Comme vous pouvez le voir je passe à la fragment d'une Chaîne (tempTab.getTabId()
), dans cette ligne:
GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId());
Dans le fragment lui-même je le fais pour l'initialiser:
public static final GridFragment newInstance(String tabId)
{
GridFragment f = new GridFragment();
Bundle bdl = new Bundle(2);
bdl.putString(TAB_ID, tabId);
f.setArguments(bdl);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
String tabId = getArguments().getString(TAB_ID);
if (application.currentReport != null)
{
this.odTab = application.currentReport.getODTabByTabId(tabId);
}
else
{
startActivity(new Intent(getActivity(), LoginScrActivity.class));
}
super.onCreate(savedInstanceState);
}
Tout cela est effectué dans l'ordre pour ne pas remplacer le vide par défaut du constructeur du fragment, comme je comprends que ce n'est pas recommandé.
Maintenant, j'ai besoin d'obtenir l'instance de la odTab
objet que j'ai mis dans le visible fragment de cette ligne:
this.odTab = application.currentReport.getODTabByTabId(tabId);
Quelqu'un pourrait-il m'expliquer comment cela pourrait être fait?
Comment puis-je obtenir actuellement visible fragment d'instance afin que je puisse tirer le odTab objet hors de lui?
Mise à JOUR:
Avec les suggestions que j'ai reçu ici, j'ai ajouté un odTab
objet instance de la classe application qui est appelé currentVisibleTab
et je suis réglage de l'instance de la odTab comme ceci:
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
Log.d(TAG, "setUserVisibleHint invoked!");
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
{
if (odTab != null && getActivity() != null)
{
Log.d(TAG, "Currently visable tab: "+odTab.getTabTitle());
application.currentVisibleTab = odTab;
}
}
}
UPDATE2:
C'est mon ViewPagerAdapter
:
public class ViewPagerAdapter extends FragmentPagerAdapter
{
private List<Fragment> fragments;
/**
* @param fm
* @param fragments
*/
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void removeAllFragments()
{
this.fragments.clear();
}
public void addFragmentsListToAdapter(List<Fragment> fragments)
{
this.fragments.addAll(fragments);
}
public List<Fragment> getFragments()
{
return fragments;
}
}
En elle j'ai un List
de fragments qui sont indiquées par la ViewPager
. Cette liste est initialisée comme ceci:
List<Fragment> fragments = new Vector<Fragment>();
Ce que je ne comprends pas, c'est la façon dont je m'référence à l'actuel fragment qui a déclenché la méthode de l'interface à partir de cette liste.
Et ce n'est pas une question connexe, mais peut-être que vous connaissez la réponse: Quelle est la différence entre List
et Vector
?
J'ai encore vérifier cette possibilité.
- stackoverflow.com/questions/10024739/.... cochez cette
- Hey @Raghunandan, j'ai essayé le "setUserVisibleHint" option mais pour une raison quelconque n'a pas réussi à obtenir ce droit. Alors j'ai pensé que ce n'est pas la voie. Je vais jeter un oeil à ce nouveau.
- remplacer le
setUserVisibleHint
et l'utilisationGridFragment.newInstance(tabId)
à l'intérieur desetUserVisibleHint
. journal de l'instance et de vérifier. pas testé juste une suggestion. - Je n'ai pas vraiment compris ce que tu veux dire par: "journal de l'instance et de vérifier, consultez la mise à jour de réponse. Est ce que j'ai fait est le bon sens?
- a l'air bien. vous avez voulu l'instance de GridFragment droit?
- Non, j'ai besoin de l'exemple de la odTab objet qui est à l'intérieur de la actuellement visible GridFragment.
- oh ok. j'ai mal compris. votre mise à jour a l'air bien.
- Merci pour votre aide, je vais continuer de le vérifier et de vous laisser savoir.
Vous devez vous connecter pour publier un commentaire.
Le moyen que j'ai trouvé actuellement visible fragment est à l'aide de
setUserVisibleHint
et une interface vers leViewPager
. Cette méthode est décrite dans le fragment classe. Remplacer et à utiliser une interface à retour d'appel à votreViewPager
. Si le fragment est visible à - dire qu'elle renvoie true - alors il suffit d'utiliser une référence à votre fragment (soit à partir de la liste de sauvegarde de votre carte ou que vous stockée comme une variable d'instance) pour obtenir ce que vous avez besoin de le fragment lui-même. J'ai ajouté le code ci-dessous.Déclarer une interface liée à tout ce que vous voulez faire. Dans mon cas, j'ai été en utilisant cette désactiver le
ViewPager
défaut de direction x écouteur quand une Carte Google instance était visible, de sorte que le défilement de la carte n'a pas de déclencher le changement de fragment.Dans le fragment:
Une chose qui n'était pas évident jusqu'à ce que j'ai essayé était le plus de la les isattached variable. J'ai également remplacer les fragments onAttach méthode et de définir en vrai une fois qu'il est appelé. Sinon ce qui se passe est votre fragment sera visible pour l'utilisateur et tente d'appeler l'interface de votre
ViewPager
avant que l'interface est initialisé.Dans mon
ViewPager
je viens de mettre en œuvre les OnMapFragmentVisibleListener puis ajouter la méthodeDans mon cas, je l'ai utilisé pour éteindre le
ViewPager
balayez vers la fonction. Cependant, j'aurais facilement pu en appeler à une méthode publique dans mon mapFragment. J'ai justement 3 fragments dans monViewPager
que j'ai garder en référence.Mise à jour
Pour trouver le fragment qui est actuellement affichée, vous devez d'abord savoir quel fragment est affichée. Vous pouvez faire un certain nombre de façons. Le plus simple est de passer quelques descripteur de retour à votre
ViewPager
/FragmentActivity
avec l'interface que vous avez créé auparavant.Le problème avec votre configuration est que vous êtes à l'aide d'un
Vector
qui est vraiment un synchroniséList
pour stocker vos références de fragments. En conséquence, il n'existe pas de valeur de clé par lequel vous pouvez trouver vos fragments plus tard. Les Fragments ont la capacité d'être identifié par une balise qui est créé lors de l'fragment de transactions lorsqu'ils sont ajoutés à la fragment de l'activité. Cependant, dans unViewPager
de l'installation, vous n'ajoutez pas les fragments individuellement et ne peut donc pas ajouter des balises lors de la transaction.Ma solution a été de retour sur mon
BasePagerAdapter
avec unHashMap
dans lequel je stocke chaque fragment identifié par une clé unique.Puis-je utiliser la carte:
Parce que vos références sont stockées à des valeurs-clés, il est facile de trouver le fragment que vous cherchez parce que vous pouvez simplement effectuer une recherche par clé à partir de la
HashMap
et de retour.Si vous ne pouvez pas changer la configuration pour obtenir loin de la
Vector
vous devez soit (1) de garder une trace de la fragment que vous ajoutez dans l'ordre (en supposant que les fragments ne sont pas ajoutés et supprimés de manière dynamique), de sorte que vous pouvez obtenir grâce à un indice ou (2) séparer les références de chaque fragment.Une autre chose qui rend cela plus facile, c'est que mon fragments sont tous les sous-classés. E. g. chaque fragment qui remplit une fonction différente a sa propre classe. Comme il n'y a qu'une seule instance de chaque classe, il est facile à trouver car je n'ai pas de doublons. Si vous êtes à l'aide de tous les membres génériques de la
Fragment
classe que vous avez juste besoin de mettre en œuvre un système de marquage qui fait l'une des approches ci-dessus possible.ViewPager
quelque part. Une fois que vous obtenez le rappel en disant fragment de x est visible juste obtenir cette référence de la collection.Vous pouvez obtenir le courant visible fragment à l'aide de viewpager.getCurrentItem() la méthode de la façon suivante:
Fragment fr = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R. id.pager + ":" + mViewPager.getCurrentItem());
merci,
Sulabh