我使用一个ViewPager和一个FragmentStatePagerAdapter来托管三个不同的片段:
(Fragment1) (Fragment2) (Fragment3)
当我想从FragmentActivity中的ViewPager中获取Fragment1时。
问题是什么,我该如何解决它?
我使用一个ViewPager和一个FragmentStatePagerAdapter来托管三个不同的片段:
(Fragment1) (Fragment2) (Fragment3)
当我想从FragmentActivity中的ViewPager中获取Fragment1时。
问题是什么,我该如何解决它?
当前回答
我用一种不同的方法简单地实现了这一点。
我的自定义FragmentAdapter。getItem方法返回的不是新的MyFragment(),而是在FragmentAdapter构造函数中创建的MyFragment实例。
在我的活动中,我然后从适配器获得片段,检查它是否是需要的片段的instanceOf,然后强制转换和使用所需的方法。
其他回答
在TabLayout中有多个标签片段。你可以通过标签找到片段,使用片段的索引。
例如,Fragment1的索引是0,所以在findFragmentByTag()方法中,传递Viewpager的标记。使用fragmentTransaction后可以添加、替换fragment。
字符串标签= "android:switcher:" + R.id.viewPager + ":" + 0; Fragment1 f = (Fragment1) getSupportFragmentManager().findFragmentByTag(tag);
最好的解决方案是使用我们在CodePath中创建的名为SmartFragmentStatePagerAdapter的扩展。按照这个指南,这使得从ViewPager中检索片段和当前选择的片段变得非常容易。它还可以更好地管理嵌入到适配器中的片段的内存。
在片段
public int getArgument(){
return mPage;
{
public void update(){
}
在FragmentActivity
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for(Fragment f:fragments){
if((f instanceof PageFragment)&&(!f.isDetached())){
PageFragment pf = (PageFragment)f;
if(pf.getArgument()==pager.getCurrentItem())pf.update();
}
}
为了从ViewPager中获取当前可见片段。我用了这个简单的语句,效果很好。
public Fragment getFragmentFromViewpager()
{
return ((Fragment) (mAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem())));
}
主要答案依赖于框架生成的名称。如果这种情况发生变化,那么它将不再起作用。
这个解决方案怎么样,重写你的Fragment(State)PagerAdapter的instantiateItem()和destroyItem():
public class MyPagerAdapter extends FragmentStatePagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return ...;
}
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(...);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}
在处理可用的Fragments时,这似乎对我有用。尚未实例化的片段在调用getRegisteredFragment时将返回null。但我一直在使用这个主要是为了获得当前片段的ViewPager: adapter . getregisteredfragment (viewpage . getcurrentitem()),这不会返回null。
我不知道这个解决方案还有什么其他缺点。如果有的话,我想知道。