我正在使用一个包含3个或更多片段的ViewPager来显示和存储CustomView作为字段。
在托管FragmentActivity的过程中,我需要访问和设置CustomView的属性和字段,以便改变它们的显示方式。
问题发生在我需要访问尚未实例化的片段时,如活动开头的第三个片段(第一个片段默认选中,只有下一个片段被实例化)。
我的Acticity:
public class VectorProduct extends FragmentActivity {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pager);
final ActionBar bar = getSupportActionBar();
bar.setSubtitle(R.string.bt_dashboard_vector_product);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mTabsAdapter = new TabsAdapter(this, bar, mViewPager);
mTabsAdapter.addTab(bar.newTab().setText("Vector 1"), VectorFragment.class);
mTabsAdapter.addTab(bar.newTab().setText("Vector 2"), VectorFragment.class);
mTabsAdapter.addTab(bar.newTab().setText("Vector 3"), VectorFragment.class);
}
public static class TabsAdapter extends FragmentPagerAdapter implements
ViewPager.OnPageChangeListener, ActionBar.TabListener {
private final FragmentManager mFragmentManager;
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private ArrayList<Class<? extends Fragment>> Fragments;
public TabsAdapter(FragmentActivity activity, ActionBar actionBar,
ViewPager pager) {
super(activity.getSupportFragmentManager());
mFragmentManager = activity.getSupportFragmentManager();
mContext = activity;
mActionBar = actionBar;
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
setFragments(new ArrayList<Class<? extends Fragment>>());
}
public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss) {
mActionBar.addTab(tab.setTabListener(this));
getFragments().add(clss);
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
try {
return Fragments.get(position).newInstance();
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
return null;
}
public Fragment findFragment(int position) {
String name = "android:switcher:" + mViewPager.getId() + ":" + position;
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment == null) {
fragment = getItem(position);
}
return fragment;
}
}
}
答案 0 :(得分:3)
如果您不介意ViewPager中每个页面的片段始终被实例化,那么我会在初始化ViewPager之后在onCreateView中更改屏幕外页面限制:
mViewPager.setOffscreenPageLimit(2);
我现在把它放到2,因为你有3个标签。对于4个标签,它将是3,依此类推。 来自Android API的文档:http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)
将屏幕外限制更改为选项卡数减1,表示正在加载所有选项卡的所有相邻片段。默认情况下,此值为1,因此仅加载了最近的选项卡。
请注意,此功能最近已添加(我认为支持package v4 release 6),因此请确保您的支持包是最新的。
答案 1 :(得分:0)
尝试在单个Fragment类的onCreateView()方法中实例化片段,而不是在此处执行此操作。有关详细信息,请参阅http://android.codeandmagic.org/2011/08/android-dynamic-form-fragment/。
答案 2 :(得分:0)
问题是您可以动态创建片段(根据需要),但您的应用程序逻辑假定片段始终存在(或者更确切地说:只要活动存在)。 user936414的解决方案有效,因为这样可以确保在实例化活动之后片段已经存在。
请注意,如果您只想显示(包)视图,则可能根本不想使用片段。您可以直接在ViewPager
中实例化视图。这似乎特别适用,因为您希望始终访问所有页面内容。有关完整代码的示例,请参阅https://stackoverflow.com/a/8685189/243165。
答案 3 :(得分:0)
您必须使用嵌套片段,将片段嵌入父片段中。调用父片段 getChildFragmentManager()而不是 getFragmentManager()来获取正常工作的FragmentManager。