先新建几个fragment,包括java和xml
然后在主界面的布局文件中:
<android.support.v4.view.ViewPager android:id="@+id/main_viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9"> </android.support.v4.view.ViewPager>
然后在java中,实现viewpager的适配器,其中imageMove函数是用来选择时让下方标签的阴影做一个平移动画。
class MyFrageStatePagerAdapter extends FragmentStatePagerAdapter { private List<Fragment> fragmentlist; public MyFrageStatePagerAdapter(FragmentManager fm, List<Fragment> fragmentlist2) { super(fm); fragmentlist = fragmentlist2; } @Override public Fragment getItem(int position) { return fragmentlist.get(position); } @Override public int getCount() { return fragmentlist.size(); } /** * 每次更新完成ViewPager的内容后,调用该接口,此处复写主要是为了让导航按钮上层的覆盖层能够动态的移动 */ @Override public void finishUpdate(ViewGroup container) { super.finishUpdate(container);//这句话要放在最前面,否则会报错 //获取当前的视图是位于ViewGroup的第几个位置,用来更新对应的覆盖层所在的位置 int currentItem=main_viewpager.getCurrentItem(); if (currentItem==currenttab) { return ; } imageMove(main_viewpager.getCurrentItem()); currenttab=main_viewpager.getCurrentItem(); } } /** * 移动覆盖层 * @param moveToTab 目标Tab,也就是要移动到的导航选项按钮的位置 * 第一个导航按钮对应0,第二个对应1,以此类推 */ private void imageMove(int moveToTab) { int startPosition=0; int movetoPosition=0; startPosition=currenttab*(screenWidth/4); movetoPosition=moveToTab*(screenWidth/4); //平移动画 // TranslateAnimation translateAnimation=new TranslateAnimation(startPosition,movetoPosition, 0, 0); // translateAnimation.setFillAfter(true); // translateAnimation.setDuration(200); // imageviewOvertab.startAnimation(translateAnimation); }
fragmentList = new ArrayList<Fragment>(); fragmentList.add(new MessageFragment()); fragmentList.add(new FriendsFragment()); fragmentList.add(new FunctionFragment()); fragmentList.add(new MineFragment()); // main_viewpager.setAdapter(new MyFrageStatePagerAdapter(getSupportFragmentManager(),fragmentList)); viewpager_compose.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override //第一个参数为变化后的X轴位置 //第二个参数为变化后的Y轴的位置 //第三个参数为原先的X轴的位置 //第四个参数为原先的Y轴的位置 public void onScrollChange(View view, int i, int i1, int i2, int i3) { Log.d(TAG, "onScrollChange: 参数一"+String.valueOf(i)); Log.d(TAG, "onScrollChange: 参数二"+String.valueOf(i2)); } });
让Fragment保留不销毁:
- 方案一:设置ViewPager的缓存界面数
此方案适用于界面数较少的情况,避免缓存界面太多导致内存吃紧。
方法:
mPager .setOffscreenPageLimit(2);
参数:int limit - 缓存当前界面每一侧的界面数
以上述为例,当前界面为1,limit = 2,表示缓存2、3两个界面。如此便避免了界面3被销毁。
- 方案二:保存状态并恢复
此方案适用于可用界面信息可由状态保存和恢复实现的情况。
在onDestroyView方法内保存相关信息,在onCreateView方法内恢复信息设置。
- 方案三(推荐):复用Fragment的RootView
此方案适用通用场景,推荐使用。
步骤1:在onDestroyView方法内把Fragment的RootView从ViewPager中remove
@Override public void onDestroyView() { LogUtils.d(TAG , "-->onDestroyView"); super .onDestroyView(); if (null != FragmentView) { ((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView); } }
步骤2:在onCreateView方法内复用RootView
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LogUtils.d (TAG, "-->onCreateView"); if (null == mFragmentView) { mFragmentView = inflater.inflate(R.layout.fragment, container, false); mListView = (ListView) mFragmentView .findViewById(R.id.mm_listview); mListView.setAdapter(mAdapter); mPbar = (ProgressBar) mFragmentView.findViewById(R.id.pbar_mm_loading); mPbar.setVisibility(View.VISIBLE); } return mFragmentView ; }