【发布时间】:2013-06-22 08:13:18
【问题描述】:
我正在构建一个在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 对象?
更新:
根据我在这里收到的建议,我向名为 currentVisibleTab 的应用程序类添加了一个 odTab 对象实例,并且我正在设置 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;
}
}
}
更新 2:
这是我的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;
}
}
在其中我有一个由ViewPager 显示的片段的List。这个列表是这样初始化的:
List<Fragment> fragments = new Vector<Fragment>();
我不明白的是我如何从这个列表中获得对触发接口方法的当前片段的引用。
这不是一个相关的问题,但也许你知道答案:List 和 Vector 有什么区别?
我仍然检查这个选项。
【问题讨论】:
-
嘿@Raghunandan,我尝试了“setUserVisibleHint”选项,但由于某种原因没有成功。所以我发现这不是办法。我会再看看这个。
-
覆盖
setUserVisibleHint并在setUserVisibleHint中使用GridFragment.newInstance(tabId)。记录实例并检查。没有测试只是一个建议。 -
我不太明白你的意思:“记录实例并检查”,请参阅更新的答案。我做的方向对吗?
-
看起来不错。你想要 GridFragment 的实例对吗?
标签: android android-fragments android-viewpager instance