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'utilisation GridFragment.newInstance(tabId) à l'intérieur de setUserVisibleHint. 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.

InformationsquelleAutor Emil Adz | 2013-06-25