ViewPager+Fragment可以让我们快速搭建出一个新闻类app的框架,我们先来看一下效果

android tablayout tab 动态设置宽度 android tab fragment_ide

其实实现起来非常简单,我们先来看一下主页面的布局文件


ViewPager是v4包下的不用多说了,顶部的Tab导航条也是使用的v4包下的,其实我们很少用到,很多人根本也都不知道,谷歌原来还给我们提供了这样一个Tab导航条,其实效果还是挺不错的。

接下来看一下Fragment的代码


/**
     * 用来实例化一个FirstFragment,并且传入一个标题和页码
     */
    public static FirstFragment newInstance(String title , int page){
        FirstFragment firstFragment = new FirstFragment();
        Bundle args = new Bundle();
        args.putInt("page", page);
        args.putString("title", title);
        firstFragment.setArguments(args);
        return firstFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获得从MainActivity添加fragment时传入的标题和页码
        mPage=getArguments().getInt("page");
        mTitle=getArguments().getString("title");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //通过反射得到fragment的布局
        View view = inflater.inflate(R.layout.first_fragment, container, false);
        TextView title = (TextView) view.findViewById(R.id.tv_first_title);
        TextView page = (TextView) view.findViewById(R.id.tv_first_page);
        //显示标题
        title.setText(mTitle);
        //显示页码
        page.setText(String.valueOf(mPage));
        return view;
    }
}


fragment的布局文件



MainActivity.java


public class MainActivity extends FragmentActivity {
    private ViewPager mViewPager;
    private FragmentPagerAdapter mAdapter;
    private static final String[] TITLES={"头条","娱乐","科技","财经","汽车"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这句话是隐藏顶部的ActionBar,实现全屏效果
        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //拿到ViewPager
        mViewPager=(ViewPager) findViewById(R.id.my_viewpager);
        //实例化adapter
        mAdapter=new MyPagerAdapter(getSupportFragmentManager());
        //给ViewPager设置适配器,将内容显示到ViewPager中
        mViewPager.setAdapter(mAdapter);
        //这个方法是用来给ViewPager翻页的时候添加动画的
        mViewPager.setPageTransformer(true, new ViewPager.PageTransformer() {

            @Override
            public void transformPage(View view, float position) {
                //(-infinite,-1),此时view已经完全移除屏幕的左方
                if (position<-1) {
                    //将view设置成完全透明
                    view.setAlpha(0);
                //[-1,0],此时view的一部分已经移出屏幕左边,但是没有整个移出,随着view
                //向左边移动,position会逐渐从0-->-1变化。这时我们就可以利用这个不断变化的position
                }else if (position<=0) {
                    //此时position是从0到-1不断减小的,Math.abs(position)是取position的绝对值
                    //是从0到1不断增大的,所以我们用1减去position的绝对值,得到的数值是一个从1到0不断
                    //减小的值,setAlpah(0)是完全透明,setAlpha(1)是完全不透明,所以这句代码就实现
                    //了view随着向屏幕左方移动的同时,渐渐淡出的效果。而当view从屏幕左边慢慢移回屏幕
                    //的中央时,正好是反过来的,所以实现了渐渐淡入的效果
                    view.setAlpha(1-Math.abs(position));
                //(0,1],此时view的一部分已经移出屏幕右边,但是没有整个移出,随着view向右边移动,
                //position会逐渐从0-->1变化    
                }else if (position<=1) {
                    //由于position是从0到1逐渐变化的,所以1-position是从1到0逐渐变化的,所以随着
                    //view向屏幕右方慢慢移动的同时,表现出渐渐淡出的效果,相反,会表现出渐渐淡入的效果
                    view.setAlpha(1-position);
                //(1,infinite),view已经完全移动出屏幕右方    
                }else{
                    //将view设置成完全透明
                    view.setAlpha(0);
                }
            }
        });
    }

    /**
     * ViewPager的适配器,这里使用了static修饰符,我们在开发中,如果一个内部类没有使用到外部类的
     * 成员变量时,我们就将其用static修饰一下,因为这样就会使内部类放弃外部类的一个强引用,否则将会
     * 有内存泄露的危险。
     */
    public static class MyPagerAdapter extends FragmentPagerAdapter{
        //一共有5页
        private static final int MAX_ITEM=5;
        //构造方法,一定要实现的,这里要注意一下,如果要是使用v4包下的fragment,那么这里导包
        //也要导v4下的包,否则会出现错误,通常新手会手足无措
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            // TODO Auto-generated constructor stub
        }

        /**
         * 根据ViewPager当前的下标,实例化fragment。由于我们演示的fragment都是相同的结构,
         * 为了方便这里我们只创建了一种fragment,通常我们每一个页面所需要显示的布局都是不一样的
         * 那么就需要创建几个不一样的fragment,道理一样,这里我就不赘述了
         */
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return FirstFragment.newInstance("头条",1);
                case 1:
                    return FirstFragment.newInstance("娱乐",2);
                case 2:
                    return FirstFragment.newInstance("科技",3);
                case 3:
                    return FirstFragment.newInstance("财经",4);
                case 4:
                    return FirstFragment.newInstance("汽车",5);

            }
            return null;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return MAX_ITEM;
        }
        //根据ViewPager当前下标,给Tab导航条赋值
        @Override
        public CharSequence getPageTitle(int position) {
            return TITLES[position];
        }
    }
}