如何访问 FragPagerAdapter 中的特定片段?

How do you access a specific fragment in FragPagerAdapter?

我目前有一个 FragmentPagerAdapter,它通过 getItem(int position) 方法为每个 Fragment 创建新的实例。但是,我不太确定如何访问我再次创建的片段。是否有另一个 class 可以从 FragmentPagerAdapter 调用的 public 方法来 select 在例如位置 12 处创建的特定 Fragment?

public class ChannelFragmentAdapter extends FragmentPagerAdapter {
    private int numChannels;
    public ChannelFragmentAdapter(FragmentManager fm, Activity context, PatientSettings user) {
        super(fm);
        this.context = context;
        numChannels = user.channelsLimit;
        for(int i = 1; i <= numChannels; i++){
            channelTabs.add("" + i);
        }
    }

    @Override
    public int getCount() {
        return channelTabs.size();
    }

    @Override
    public Fragment getItem(int position) {
        //new instance is a static factory for creating Fragment objects
        return ChannelFragment.newInstance(position + 1, this);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        //generate title based on item position
        //return tabTitles[position];
        return  channelTabs.get(position);
    }
}

我想您正在尝试创建一个支持 5 个以上片段的 viewpager,因此使用 FragmentStatePagerAdapter 更好。

回到你的问题,使用 Fragment 标签并通过 findFragmentByTag() 进入。在您的适配器中,将它们存储在列表中,并在您需要时随时获取它们。

public class ChannelFragmentAdapter extends FragmentPagerAdapter {
    private int numChannels;
    Map<Integer, String> tags;

    public ChannelFragmentAdapter(FragmentManager fm, Activity context, PatientSettings user) {
        super(fm);
        this.context = context;
        numChannels = user.channelsLimit;
        tags = new HashMap<>();
        for (int i = 1; i <= numChannels; i++) {
            channelTabs.add("" + i);
        }
    }

    @Override
    public int getCount() {
        return channelTabs.size();
    }

    @Override
    public Fragment getItem(int position) {
        //new instance is a static factory for creating Fragment objects
        return ChannelFragment.newInstance(position + 1, this);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        //generate title based on item position
        //return tabTitles[position];
        return channelTabs.get(position);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
        tags.put(position, createdFragment.getTag());
        // ... save the tags somewhere so you can reference them later
        return createdFragment;
    }
}

注意:使用findFragmentByTag()时请勾选null,您的片段可能会被销毁或替换。