如何在ViewPager中获取当前可见片段的实例:

问题描述 投票:3回答:3

我正在构建一个在ViewPager中显示不同片段的应用程序。我将这些片段添加到ViewPager中,如下所示:

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

如您所见,我在此行中将一个字符串(tempTab.getTabId())传递给片段:

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

在片段本身中,我将其初始化:

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

所有这些都是为了不覆盖该片段的默认空构造函数而执行的,据我所知,不建议这样做。

现在,我需要获得我在此行中放入当前可见片段的odTab对象的实例:

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

有人可以向我解释如何做到这一点吗?如何获取当前可见的片段实例,以便可以将odTab对象从中拉出?

UPDATE:根据我在这里收到的建议,我将一个odTab对象实例添加到了名为currentVisibleTab的应用程序类中,然后像这样设置odTab的实例:

@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:这是我的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;
}
}

其中有List的片段,由ViewPager显示。该列表的初始化如下:

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

我不明白的是,我如何从该列表中获取对触发了接口方法的当前片段的引用。这不是一个相关的问题,但也许您知道答案:ListVector有什么区别?

我仍然检查此选项。

android android-fragments android-viewpager instance
3个回答
6
投票

我发现当前可见片段的方式是使用setUserVisibleHint和返回ViewPager的接口。此方法在fragment类中。覆盖它,并使用一个接口回调到您的ViewPager。如果片段是可见的-即它返回true-则只需使用对片段的引用(从支持适配器的列表或存储为实例变量的列表中获取)即可从片段本身中获取所需的任何内容。我在下面添加了代码。


4
投票

您可以通过以下方式使用viewpager.getCurrentItem()方法获取当前可见的片段:


0
投票

截至2020年,我在科特林的方式:

© www.soinside.com 2019 - 2024. All rights reserved.