Jak uzyskać wystąpienie aktualnie widocznego fragmentu w ViewPager:

Buduję aplikację, która pokazuje różne fragmenty wViewPager. Dodaję te fragmenty doViewPager lubię to:

 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);
}

Jak widać, przekazuję fragmentowi ciąg (tempTab.getTabId()), w tej linii:

GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId());

W samym fragmencie robię to, aby go zainicjować:

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);
}

Wszystko to jest wykonywane, aby nie przesłonić domyślnego pustego konstruktora fragmentu, ponieważ rozumiem, że nie jest to zalecane.

Teraz muszę pobrać wystąpienieodTab obiekt, który umieściłem w aktualnie widocznym fragmencie tej linii:

this.odTab = application.currentReport.getODTabByTabId(tabId);

Czy ktoś mógłby mi wyjaśnić, jak można to zrobić? Jak uzyskać aktualnie widoczną instancję fragmentu, abym mógł wyciągnąć z niej obiekt odTab?

AKTUALIZACJA: Z sugestiami, które tu otrzymałem, dodałemodTab instancja obiektu do wywoływanej klasy aplikacjicurrentVisibleTab i ustawiam instancję odTab tak:

@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: To jest mójViewPagerAdapter:

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

W nim mamList fragmentów pokazanych przezViewPager. Ta lista jest inicjowana w następujący sposób:

 List<Fragment> fragments = new Vector<Fragment>();

Nie rozumiem jednak, w jaki sposób otrzymuję odniesienie do bieżącego fragmentu, który wywołał metodę interfejsu z tej listy. I nie jest to pytanie powiązane, ale może znasz odpowiedź: jaka jest różnica międzyList iVector?

Wciąż sprawdzam tę opcję.

questionAnswers(2)

yourAnswerToTheQuestion