如何访问 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,您的片段可能会被销毁或替换。
我目前有一个 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,您的片段可能会被销毁或替换。