ViewPager和Fragment的组合使用

       

支持手指滑动切换页面,也支持点击导航按钮切换页面。

页面布局文件:

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context=".MainActivity" >  
      
    <!-- 底部四个导航按钮 -->  
    <LinearLayout   
        android:id="@+id/ll_tabs"  
        android:layout_width="match_parent"  
        android:layout_height="50dp"  
        android:layout_alignParentBottom="true"  
        android:orientation="horizontal"  
        >  
          
        <Button   
            android:id="@+id/btn_one"  
            android:layout_width="0dp"  
            android:layout_height="match_parent"  
            android:layout_weight="1"  
            android:text="One"  
            android:background="#009eff"  
            android:textColor="#fff"  
            />  
        <Button   
            android:id="@+id/btn_two"  
            android:layout_width="0dp"  
            android:layout_height="match_parent"  
            android:layout_weight="1"  
            android:text="Two"  
            android:background="#009e00"  
            android:textColor="#fff"  
            />  
        <Button   
            android:id="@+id/btn_three"  
            android:layout_width="0dp"  
            android:layout_height="match_parent"  
            android:layout_weight="1"  
            android:text="Three"  
            android:background="#009eff"  
            android:textColor="#fff"  
            />  
        <Button   
            android:id="@+id/btn_four"  
            android:layout_width="0dp"  
            android:layout_height="match_parent"  
            android:layout_weight="1"  
            android:text="Four"  
            android:background="#009e00"  
            android:textColor="#fff"  
            />  
          
    </LinearLayout>  
      
    <!-- 覆盖在导航按钮上的覆盖层,表示选中项 -->  
    <ImageView   
        android:id="@+id/imgv_overtab"  
        android:layout_width="60dp"  
        android:layout_height="50dp"  
        android:background="@drawable/red"  
        android:layout_alignParentBottom="true"  
        />  
      
    <!-- 导航和视图的分割线 -->  
    <View   
        android:layout_width="match_parent"  
        android:layout_height="2dp"  
        android:background="#f00"  
        android:layout_above="@id/ll_tabs"  
        />  
      
    <!--   
    <RelativeLayout  
        android:id="@+id/fragment_content_view"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:layout_above="@id/ll_tabs"  
        android:layout_marginBottom="2dp"  
        android:background="#fff"  
        />  
     -->  
       
     <!-- VIewPager 主要是加载内容的 -->  
     <android.support.v4.view.ViewPager  
        android:id="@+id/viewpager"  
        android:layout_above="@id/ll_tabs"  
        android:layout_marginBottom="2dp"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"/>  
     
  
</RelativeLayout>  

 


下面是具体的代码,由于代码比较少,很容易看明白,就不做多的讲述了:

 

import java.util.ArrayList;  
import java.util.List;  
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentActivity;  
import android.support.v4.app.FragmentManager;  
import android.support.v4.app.FragmentStatePagerAdapter;  
import android.support.v4.view.ViewPager;  
import android.view.View;  
import android.view.ViewGroup;  
import android.view.View.OnClickListener;  
import android.view.animation.TranslateAnimation;  
import android.widget.Button;  
import android.widget.ImageView;  
import android.widget.RelativeLayout;  
  
public class MainActivity extends FragmentActivity implements OnClickListener{  
  
    /** 
     * 四个导航按钮 
     */  
    Button buttonOne;  
    Button buttonTwo;  
    Button buttonThree;  
    Button buttonFour;  
      
    /** 
     * 作为页面容器的ViewPager 
     */  
    ViewPager mViewPager;  
    /** 
     * 页面集合 
     */  
    List<Fragment> fragmentList;  
      
    /** 
     * 四个Fragment(页面) 
     */  
    OneFragment oneFragment;  
    TwoFragment twoFragment;  
    ThreeFragment threeFragment;  
    FourFragment fourFragment;  
      
    //覆盖层  
    ImageView imageviewOvertab;  
      
    //屏幕宽度  
    int screenWidth;  
    //当前选中的项  
    int currenttab=-1;  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        buttonOne=(Button)findViewById(R.id.btn_one);  
        buttonTwo=(Button)findViewById(R.id.btn_two);  
        buttonThree=(Button)findViewById(R.id.btn_three);  
        buttonFour=(Button)findViewById(R.id.btn_four);  
          
        buttonOne.setOnClickListener(this);  
        buttonTwo.setOnClickListener(this);  
        buttonThree.setOnClickListener(this);  
        buttonFour.setOnClickListener(this);  
          
        mViewPager=(ViewPager) findViewById(R.id.viewpager);  
          
        fragmentList=new ArrayList<Fragment>();  
        oneFragment=new OneFragment();  
        twoFragment=new TwoFragment();  
        threeFragment=new ThreeFragment();  
        fourFragment=new FourFragment();  
          
        fragmentList.add(oneFragment);  
        fragmentList.add(twoFragment);  
        fragmentList.add(threeFragment);  
        fragmentList.add(fourFragment);  
          
        screenWidth=getResources().getDisplayMetrics().widthPixels;  
          
        buttonTwo.measure(0, 0);  
        imageviewOvertab=(ImageView) findViewById(R.id.imgv_overtab);  
        RelativeLayout.LayoutParams imageParams=new RelativeLayout.LayoutParams(screenWidth/4, buttonTwo.getMeasuredHeight());  
        imageParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);  
        imageviewOvertab.setLayoutParams(imageParams);  
          
        mViewPager.setAdapter(new MyFrageStatePagerAdapter(getSupportFragmentManager()));  
    }  
  
    /** 
     * 定义自己的ViewPager适配器。 
     * 也可以使用FragmentPagerAdapter。关于这两者之间的区别,可以自己去搜一下。 
     */  
    class MyFrageStatePagerAdapter extends FragmentStatePagerAdapter  
    {  
  
        public MyFrageStatePagerAdapter(FragmentManager fm)   
        {  
            super(fm);  
        }  
  
        @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=mViewPager.getCurrentItem();  
            if (currentItem==currenttab)  
            {  
                return ;  
            }  
            imageMove(mViewPager.getCurrentItem());  
            currenttab=mViewPager.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);  
    }  
      
      
    @Override  
    public void onClick(View v)  
    {  
        switch (v.getId())  
        {  
        case R.id.btn_one:  
            changeView(0);  
            break;  
        case R.id.btn_two:  
            changeView(1);  
            break;  
        case R.id.btn_three:  
            changeView(2);  
            break;  
        case R.id.btn_four:  
            changeView(3);  
            break;  
        default:  
            break;  
        }  
    }  
    //手动设置ViewPager要显示的视图  
    private void changeView(int desTab)  
    {  
        mViewPager.setCurrentItem(desTab, true);  
    }  
  
}  

 

posted @ 2016-03-24 19:01  凤雏小呆  阅读(5676)  评论(0编辑  收藏  举报