Upv*_*ote 12 android android-fragments fragmentpageradapter
在我的应用程序中,片段活动包含两个片段,片段A和片段B.片段B是包含3个片段的视图寻呼机.

在我的活动中,为了防止在配置更改时重新创建片段:
if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, new MainTabFragment(), MAIN_TAB_FRAGMENT).commit();
}
Run Code Online (Sandbox Code Playgroud)
片段B的代码:
public class MainTabFragment extends Fragment {
private PagerSlidingTabStrip mSlidingTabLayout;
private LfPagerAdapter adapter;
private ViewPager mViewPager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
this.adapter = new LfPagerAdapter(getChildFragmentManager());
this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(adapter);
this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
this.mSlidingTabLayout.setViewPager(this.mViewPager);
}
}
Run Code Online (Sandbox Code Playgroud)
适配器代码:
public class LfPagerAdapter extends FragmentPagerAdapter {
private static final int NUM_ITEMS = 3;
private FragmentManager fragmentManager;
public LfPagerAdapter(FragmentManager fm) {
super(fm);
this.fragmentManager = fm;
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
Log.d("TEST","TEST");
switch (position) {
case 1:
return FragmentC.newInstance();
case 2:
return FragmentD.newInstance();
default:
return FragmentE.newInstance();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法保持视图分页器的状态,它的子片段在方向更改上.
显然每次轮换都要调用它:
this.adapter = new LfPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)
这将导致整个寻呼机被重建,对吧?结果是
getItem(int position)
Run Code Online (Sandbox Code Playgroud)
将在每次轮换时调用,片段将从头开始创建并失去其状态:
return FragmentC.newInstance();
Run Code Online (Sandbox Code Playgroud)
我尝试解决这个问题:
if(this.adapter == null)
this.adapter = new LfPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)
在onViewCreated,但结果是,在旋转寻呼机内的片段,其中除去.
任何想法如何正确保留寻呼机内的状态?
Meh*_*sar 27
您需要做两件事来解决问题:
1)你应该使用onCreate方法而不是onViewCreated实例化LfPagerAdapter;
即:
public class MainTabFragment extends Fragment {
private PagerSlidingTabStrip mSlidingTabLayout;
private LfPagerAdapter adapter;
private ViewPager mViewPager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
this.adapter = new LfPagerAdapter(getChildFragmentManager());
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(adapter);
this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
this.mSlidingTabLayout.setViewPager(this.mViewPager);
}
}
Run Code Online (Sandbox Code Playgroud)
2)你需要延伸FragmentStatePagerAdapter而不是FragmentPagerAdapter
| 归档时间: |
|
| 查看次数: |
16606 次 |
| 最近记录: |