是否可以访问ViewPager正在查看的当前片段?

Mit*_*lad 69 android android-fragments android-viewpager

我有一个带有ViewPager三个和三个Fragment的应用程序.我正在试图弄清楚如何让当前Fragment被观看,以便我可以得到它的论据.

OnPageChangeListener抓住了当前页面索引,但是

ViewPager.getChildAt(int position);
Run Code Online (Sandbox Code Playgroud)

返回一个View.这View和现在的关系是什么Fragment

Jam*_*mes 46

我终于找到了一个对我有用的答案.基本上,您可以使用标签"android:switcher:"+ R.id.viewpager +":0"访问viewPager页面的片段.

  • 链接答案中的方法不适用于FragmentStatePagerAdapter,但[第二个答案](http://stackoverflow.com/a/8886019/237820)对同一个链接问题有一个方法. (27认同)
  • 虽然这理论上可以回答这个问题,[但最好](http://meta.stackoverflow.com/q/8259)在此处包含答案的基本部分,并提供参考链接. (4认同)

sdl*_*sdl 18

我反过来解决了这个问题.我没有从活动中搜索片段,而是在它的所有者活动的onAttach()方法中注册片段,并在onStop()方法中取消注册.基本理念:

分段:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try{
        mActivity = (IMyActivity)activity;
    }catch(ClassCastException e){
        throw new ClassCastException(activity.toString() +" must be a IMyActivity");
    }

    mActivity.addFragment(this);
}

@Override
public void onStop() {
    mActivity.removeFragment(this);
    super.onStop();
}
Run Code Online (Sandbox Code Playgroud)

IMyActivity:

public interface IFriendActivity {
    public void addFragment(Fragment f);
    public void removeFragment(Fragment f); 
}
Run Code Online (Sandbox Code Playgroud)

MyActivity:

public class MyActivity implements IMyActivity{

    [...]

    @Override
    public void addFragment(Fragment f) {
        mFragments.add(f);
    }

    @Override
    public void removeFragment(Fragment f) {
        mFragments.remove(f);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 一旦你注册了你的片段,你如何通过它的位置找到它? (2认同)

Mik*_*e T 5

编辑 - 不要这样做.如果你有诱惑,请阅读评论为什么这是一个坏主意.

在奇怪的机会你仍然试图解决这个问题:

扩展FragmentPagerAdapter.在构造函数中,构建所需的Fragments并将它们存储在Fragments的List(array/ArrayList)中.

private final int numItems = 3;
Fragment[] frags;

public SwipeAdapter (FragmentManager fm) {
    super(fm);

    //Instantiate the Fragments
    frags = new Fragment[numItems];

    Bundle args = new Bundle();
    args.putString("arg1", "foo");

    frags[0] = new MyFragment();
    frags[1] = new YourFragment();
    frags[2] = new OurFragment();
    frags[2].setArguments(args);
}
Run Code Online (Sandbox Code Playgroud)

然后getItem(int position),你可以做类似的事情

public Fragment getItem(int position) {
    return frags[position];
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是普遍接受的做法,但它对我有用.

编辑

这真的不是一个好方法.如果您计划处理方向更改或您的应用程序进入后台,那么这可能会破坏您的代码.有关详细信息,请阅读此答案下方的评论.而是使用@James的答案

  • 这有效,直到您旋转设备.然后片段将在旋转中存活,但适配器的缓存不会.现在,当您要求显示当前显示的片段时,您将创建一个根本不使用的新片段. (3认同)
  • @RolfSmit:我同意.我只是把它留下来,以便人们阅读讨论,并可能锁定屏幕方向的人 (3认同)
  • 好点子。当Activity重新启动时,这种方式也存在一些问题,并且Fragments的`getActivity()`不返回当前活动,但是某些先前的实例已被销毁 (2认同)
  • 同意 我已经学到了更多的知识,所以我认为这不是一个好方法。许多应用都锁定屏幕方向(例如游戏),但是即使那样,如果应用转到后台然后又返回,我认为也会发生相同的问题。 (2认同)