zoukankan      html  css  js  c++  java
  • 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);  
        }  
      
    }  
  • 相关阅读:
    Appium
    Appium滑动直到页面底部
    使用Maven以及碰到的坑们(持续更新中。。。)
    通过license server激活IntelliJ IDEA
    HDU 1166
    HDU 2444
    HDU 浙江科技学院校赛2016
    HDU 5651
    HDU 5650
    Interview 位运算
  • 原文地址:https://www.cnblogs.com/fengchuxiaodai/p/5316749.html
Copyright © 2011-2022 走看看