我有一个FragmentActivity,它使用FragmentTabsPager.java
中提供的示例适配器(在Android支持v4示例中找到)标记了片段
private static class TabsAdapter extends FragmentPagerAdapter
implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
我的FragmentActivity中有一个菜单项,可以让我随意重新加载片段中的数据。在我实现tab接口之前,我可以保证所需的片段将被加载到内存中。我通过getSupportFragmentManager().findFragmentById()
获取片段,投射它,然后调用它的重载函数。很简单。
我是否可以通过FragmentActivity中的FragmentPagerAdapter
与特定的Fragment实例进行通信?使用示例中提供的TabAdapter
getItem()
,我可以检索片段的 new 实例(通过Fragment.instantiate()
),但不能查找当前显示的实例。那是重要的。
编辑:除了柏拉图的回答......
由于我的所有选项卡都是不同的类(例如.FooFragment,BarFragment等),因此识别和检索特定类型的活动片段非常有用。
Object getActiveFragmentOfType(Class<?> cls) {
List<Fragment> frags = getActiveFragments();
for(Fragment one : frags) {
if(cls.isInstance(one)) {
return one;
}
}
return null;
}
然后,当我想处理特定的选项卡/片段/类时,我就是这样做的
Object fooFragmentObject = getActiveFragmentOfType(FooFragment.class);
if(fooFragmentObject != null) {
// Do something with an active reference to fooFragmentObject that's
// guaranteed to be castable to FooFragment
}
答案 0 :(得分:1)
为片段使用基类,以便添加保存方法并获取片段所用的位置。 (你可以使用一个接口,如果你不希望它们都扩展到同一个类,所有这些都会实现)
所以你的片段类就是这样的。
class MyFragment extends SomeFragment{
public void setPosition(int position){...}
public int getPosition(){...}
......
}
在FragmentPagerAdapter
编辑getItem()
方法,以便在创建每个片段时保存位置。
@Override
public Fragment getItem(int position) {
MyFragment fragment = new MyFragment();
//save the position when you create the Fragment
fragment.setPosition(position);
return fragment;
}
然后按照here所述实现 getActiveFragments()方法
之后,通过使用getCurrentItem()
的{{1}}方法获取当前位置,创建一个获取当前片段的方法很简单。
ViewPager
让我知道这是如何产生的。