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

viewpager fragment 滑动界面的更多相关文章

  1. viewpager+fragment滑动切换卡顿问题

    最近在做项目的时候遇到个问题,viewpager中的fragment添加使用listview添加数据后出现滑动卡顿,造成用户体验感极差.找了很久的资料,也试了很多大方法,在这里给大家分享下: 1.添加 ...

  2. ViewPager +Fragment 滑动游标

    一.我的博客https://github.com/anan03/ananwork/tree/master/anan1.加入compile 'com.gxz.pagerslidingtabstrip:l ...

  3. fragment滑动界面

    1.代码页面 package com.example.fragment_list_copy; import android.app.FragmentManager;import android.sup ...

  4. ViewPager+Fragment 滑动菜单效果 实现步骤

    1.xml中引用ViewPager     <android.support.v4.view.ViewPager             android:id="@+id/viewPa ...

  5. 【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析   1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3   2.Fragment生命周期以及与Activ ...

  6. 转载【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析  原文链接 http://www.cnblogs.com/monodin/p/3866441.html 1.使用场景 ViewPager+ ...

  7. ViewPager中切换界面Fragment被销毁的问题

    ViewPager中切换界面Fragment被销毁的问题分析 使用ViewPager+Fragment实现界面切换,当界面数量大于3时,出现二次滑动后数据消失的情况,下面由Fragment生命周期进行 ...

  8. ViewPager Fragment PagerAdapter MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 使用ViewPager+Fragment来实现带滚动条的多屏滑动-IndicatorFragmentActivity

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17201587 介绍 在android应用中,多屏滑动是一种很常见的风格,博主 ...

随机推荐

  1. Mysql 预查询处理 事务机制

    预处理 PDO支持sql预处理功能,可以有效的防止sql注入的问题 例如: 以下操作会导致数据表中所有数据删除 $host = 'localhost'; $port = 3306; $dbname = ...

  2. react-native 相对项目路径导入组件

    在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,如果目录多了一长串,书写很烦,看着也不好看. 方法一: 例如你想引入utils里面的文件,不想../. ...

  3. 关于npm 包的发布

    注册一个npm 账号,打开命令行输入 npm add user 然后登录 npm login 发布npm 包,在你要发布的包的目录下,在创建账号后需要认证邮箱,否则无法发布,发布同一个包,每次的版本需 ...

  4. Django之集合函数使用与mysql表的创建特殊字段分析

    1. 集合函数的使用场景: -- 单独使用: 不分组, 只查聚合结果 -- 分组使用: 按字段分组, 可查询分组字段与聚合结果 2. 导入聚合函数 from django.db.models impo ...

  5. GCD 常用API 总结

    dispatch_sync:同步操作,会阻塞当前线程 dispatch_async:普通的异步操作,也就是在指定的队列中添加一个block操作,不会阻塞当前线程 dispatch_group_asyn ...

  6. 2319__1.5.3 Superprime Rib 特殊的质数肋骨

    [Submit][Status][Forum] Description 农民约翰母牛总是产生最好的肋骨. 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的 ...

  7. epoll_wait 时 POLLERR 与 POLLIN 同时返回的现象解析(转)

    今天code review时,同事B对我代码中的poll()的处理做法提出了异议.于是做了些研究,还发现了一些好玩的故事. 异议的代码 我的代码是参考manpage写的,类似下面的做法.同事B说没有处 ...

  8. vmware搭建lnmp环境配置域名

    找到nginx配置文件,修改server_name 然后找到/etc/hosts文件 修改成如下 之后在Windows本地的C盘的hosts文件中添加解析 好了,这样就可以访问了 通往牛逼的路上,在意 ...

  9. [CI]CodeIgniter应用配置明细

    ---------------------------------------------------------------------------------------------------- ...

  10. JSP报错Syntax error, insert ";" to complete Statement

    org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 7 in ...