如何获取ViewPager当前的Fragment

发布网友 发布时间:2022-04-21 18:27

我来回答

1个回答

热心网友 时间:2023-09-15 22:28

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 对象,如何获取当前可见片段实例?
更新:这里提出的意见与我加入了 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;
}
}
}

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

在它正如你看到的我有 List 的片段所示的 ViewPager ,此列表初始化像这样:
List<Fragment> fragments = new Vector<Fragment>();

我不明白的是如何获取对当前段落触发从该列表中的接口方法的引用。不相关的问题,但也许你知道答案,有什么区别之间List 和 Vector ?
我还查阅了此选项。
先谢谢了。
解决方法 1:
我找到的方法 visbile 片段当前正在使用 setUserVisibleHint 和回视图寻呼机的接口。此方法是在类中片段。重写它和使用回叫您查看传呼机的接口。如果该片段是可见-即它返回 true-只使用对您片段 (无论是从列表中备份您的适配器或一个您存储为一个实例变量) 的引用以获取您需要的任何从片段本身。我已经添加下面的代码。
声明有关的无论你想做一个接口。我的情况我用这来禁用 ViewPager 默认 x 方向侦听器时一个谷歌地图实例是可见的因此滚动地图没有触发片段的变化。
public interface OnMapFragmetnVisibleListener{
public void mapVisible(boolean visible);
}

在片段:
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
try{
mapFragmentVisibilityListener = (OnMapFragmentVisibleListener) activity;
isAttached = true; //flag for whether this framgnet is attache to pager
} catch (ClassCastException e){
throw new ClassCastException(activity.toString() + " must implement interface onAttach");
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser){
if(isVisibleToUser && isAttached){ //if listner is called before fragment is attached will throw NPE
mapFragmentVisibilityListener.mapVisible(true);
}
}

直到我试过这个是不明显的一件事是 isAttached 变量的加法。我也重写片段 onAttach 方法,并将其设置为 true,一旦它被称为。否则会发生什么是您片段将对用户是可见的和尝试调用的接口向您 ViewPager 接口初始化之前。
在我 ViewPager 我只是实现了 OnMapFragmentVisibleListener,然后添加所需的方法
@Override
public void mapVisible(boolean visible) {
if(visible)
viewPager.allowSwipe(false); //turn off viewPager intercept touch if map visible
}

在我的案子我用它来关闭 ViewPager 刷功能但是,我可以轻松地叫回来的公共方法中我 mapFragment。我碰巧有 3 片段我 ViewPager 我保持对的引用
更新
要查找当前的片段首先显示你需要找出哪个片段正在显示你可以通过多种方式。最简单的方法就是通过一些描述符返回到您ViewPager / FragmentActivity 与您之前创建的接口。
public interface OnFragmentVisibleListener{
public void fragmentVisible(boolean true, String tag);
}

那您设置的问题是您正在使用 Vector ,是真的同步 List 来存储您片段 rerefences。其结果是,没有通过,你可以找到你片段以后的密钥值。片段有确定的一个标签,创建在片段获利的能力,它们被添加到该片段活动期间。然而,在 ViewPager设置,您没有添加片段分别,所以无法添加标签在获利。
我的解决方案一直是回我 BasePagerAdapter 与 HashMap 在其中存储由一个唯一的密钥标识每个片段。
LinkedHashMap<String, Fragment> tabs = new LinkedHashMap<String, Fragment>();
tabs.put("Frag1", fragment1);
tabs.put("Frag2", fragment2);
tabs.put("Frag3", fragment3);

然后用此适配器
private class BasePagerAdapter extends FragmentPagerAdapter{

private LinkedHashMap<String, Fragment> tabs;

public BasePagerAdapter(LinkedHashMap<String, Fragment> tabMap, FragmentManager fm)
{
super(fm);
this.tabs = tabMap;
}

// other basic methods

因为您的引用存储到一个密钥值、 容易找到因为你只是可以通过从键值哈希映射和返回键搜索你要找的 framgment。
如果您不能更改设置要逃离 Vector 你需要到任一 (1) 跟踪的哪个片段你添加的顺序 (假设片段不添加和删除动态) 这样,你可以通过对每个片段 (2) 保持单独引用或索引
private Fragment x;

//in onCreate
x = new Fragment();

//in interface
if(tag.equals("x"){
x.doSomething();
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com