viewpager fragment 滑动界面

先新建几个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 ;
}

 

posted on 2019-02-20 12:34  赵子隆  阅读(262)  评论(0编辑  收藏  举报

导航