zoukankan      html  css  js  c++  java
  • 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 ;
    }
  • 相关阅读:
    Echarts、大屏动态折线图无状态加载
    地图获取城市编码vue-jsonp请求,处理跨域
    将数组中的元素拼接为一个字符串
    vue兄弟组件通信、兄弟组件传值(本人是用的是中央控件作为媒介),并一同解决重负传值、第一未传值
    vue、react动态新增行
    vue-antd 分页pagination相关重置问题
    关闭ESLint警告,本人使用的是vue-antd-pro
    文本长短不一文本长短不一致,css让其左右两侧对齐致,css让其左右两侧对齐
    Maven私服搭建 Nexus
    Maven常用命令
  • 原文地址:https://www.cnblogs.com/zhaozilongcjiajia/p/10405845.html
Copyright © 2011-2022 走看看