使ViewPager中的Fragment的状态不销毁
2014-11-02 12:03
211 查看
//有如下5个类似的Fragment: TabAFm,TabBFm,TabCFm,TabDFm,TabEFm,
//TabBFm
TabAFm.java
//TabBFm
//FragmentViewPagerAdapter.java
/article/1361199.html
//TabBFm
tab_a
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#C4E1FF" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="hello FragmentA!!!" android:textSize="40sp" android:textColor="#000000" /> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
TabAFm.java
public class TabAFm extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_a, container, false); } }
//TabBFm
public class TabBFm extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_b, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); this.getView().findViewById(R.id.clickme).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 获得绑定的FragmentActivity MainActivity activity = ((MainActivity)getActivity()); // 获得TabAFm的控件 EditText editText = (EditText) activity.fragments.get(0).getView().findViewById(R.id.edit); Toast.makeText(activity, activity.hello + editText.getText(), Toast.LENGTH_SHORT).show(); } }); } }
//FragmentViewPagerAdapter.java
public class FragmentViewPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener{ private List<Fragment> fragments; // 每个Fragment对应一个Page private FragmentManager fragmentManager; private ViewPager viewPager; // viewPager对象 private int currentPageIndex = 0; // 当前page索引(切换之前) private OnExtraPageChangeListener onExtraPageChangeListener; // ViewPager切换页面时的额外功能添加接口 public FragmentViewPagerAdapter(FragmentManager fragmentManager, ViewPager viewPager , List<Fragment> fragments) { this.fragments = fragments; this.fragmentManager = fragmentManager; this.viewPager = viewPager; this.viewPager.setAdapter(this); this.viewPager.setOnPageChangeListener(this); } @Override public int getCount() { return fragments.size(); } @Override public boolean isViewFromObject(View view, Object o) { return view == o; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(fragments.get(position).getView()); // 移出viewpager两边之外的page布局 } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = fragments.get(position); if(!fragment.isAdded()){ // 如果fragment还没有added FragmentTransaction ft = fragmentManager.beginTransaction(); ft.add(fragment, fragment.getClass().getSimpleName()); ft.commit(); /** * 在用FragmentTransaction.commit()方法提交FragmentTransaction对象后 * 会在进程的主线程中,用异步的方式来执行。 * 如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。 * 要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。 */ fragmentManager.executePendingTransactions(); } if(fragment.getView().getParent() == null){ container.addView(fragment.getView()); // 为viewpager增加布局 } return fragment.getView(); } /** * 当前page索引(切换之前) * @return */ public int getCurrentPageIndex() { return currentPageIndex; } public OnExtraPageChangeListener getOnExtraPageChangeListener() { return onExtraPageChangeListener; } /** * 设置页面切换额外功能监听器 * @param onExtraPageChangeListener */ public void setOnExtraPageChangeListener(OnExtraPageChangeListener onExtraPageChangeListener) { this.onExtraPageChangeListener = onExtraPageChangeListener; } @Override public void onPageScrolled(int i, float v, int i2) { if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口 onExtraPageChangeListener.onExtraPageScrolled(i, v, i2); } } @Override public void onPageSelected(int i) { fragments.get(currentPageIndex).onPause(); // 调用切换前Fargment的onPause() if(fragments.get(i).isAdded()){ fragments.get(i).onResume(); // 调用切换后Fargment的onResume() } currentPageIndex = i; if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口 onExtraPageChangeListener.onExtraPageSelected(i); } } @Override public void onPageScrollStateChanged(int i) { if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口 onExtraPageChangeListener.onExtraPageScrollStateChanged(i); } } /** * page切换额外功能接口 */ static class OnExtraPageChangeListener{ public void onExtraPageScrolled(int i, float v, int i2){} public void onExtraPageSelected(int i){} public void onExtraPageScrollStateChanged(int i){} } }//MainActivity.java
public class MainActivity extends FragmentActivity { private ViewPager viewPager; public List<Fragment> fragments = new ArrayList<Fragment>(); public String hello = "hello "; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); fragments.add(new TabAFm()); fragments.add(new TabBFm()); fragments.add(new TabCFm()); fragments.add(new TabDFm()); fragments.add(new TabEFm()); viewPager = (ViewPager) findViewById(R.id.viewPager); FragmentViewPagerAdapter adapter = new FragmentViewPagerAdapter(this.getSupportFragmentManager(), viewPager,fragments); adapter.setOnExtraPageChangeListener(new FragmentViewPagerAdapter.OnExtraPageChangeListener(){ @Override public void onExtraPageSelected(int i) { System.out.println("Extra...i: " + i); } }); }//Android FragmentManage FragmentTransaction介绍
/article/1361199.html
相关文章推荐
- 防止ViewPager中的Fragment被销毁的方法
- 防止ViewPager中的Fragment被销毁的方法
- android解决fragment+viewpager状态保存问题
- 【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁
- 关于Viewpager中的Fragment 滑动时保存状态的问题
- Android中ViewPager中Fragment被销毁问题
- 解决ViewPager切换Fragment的销毁Fragment带来的问题
- ViewPager防止Fragment销毁以及取消Fragment的预加载
- Android -- ViewPager、Fragment、状态保存、通信
- (转)防止ViewPager中的Fragment被销毁的方法
- 为什么viewpager中的fragment会销毁。??
- 防止ViewPager中的Fragment被销毁的方法
- 防止ViewPager中的Fragment被销毁的方法
- Viewpager中的Fragment 滑动时保存状态的问题
- 实现Fragment->ViewPager->Fragment嵌套,并保存内层Fragment view 状态
- ViewPager中切换界面Fragment被销毁的问题
- ViewPager中切换界面Fragment被销毁解析
- ViewPager防止Fragment销毁以及取消Fragment的预加载
- ViewPager中切换界面Fragment被销毁的问题分析ViewPager中切换界面Fragment被销毁的问题分析
- 防止ViewPager中的Fragment被销毁的方法