页面切换的3种实现

本文探讨了页面切换的三种实现方式,详细解析了每种方法的原理和应用场景,帮助读者理解如何在不同场景下选择合适的页面切换解决方案。

页面切换的实现


这里要实现页面切换的三种方式:
方法一: 首页等ViewPager(配合Fragment或View) + LinearLayout(配合TextView)框架搭建;
方法二: ViewPagerIndicator 或使用 PagerSlidingTab实现;
方法三: 用Fragment + frameLayout;


方式一:主要是思路,先看布局吧:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <!--  <ui.PagerSlidingTab		//方式三:自定义的Tab类,后边有介绍
        android:id="@+id/pager_tab"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="@drawable/selector_color"
        app:dividerColor="#00000000"
        app:shouldExpand="true"
        app:indicatorColor="#40AA53"/>-->

      <com.viewpagerindicator.TitlePageIndicator   //方式三:页面切换---页面上边Tab控制
       android:id="@+id/pager_tab"
       android:padding="10dip"
       android:layout_height="45dp"
       android:layout_width="fill_parent"
       android:background="#18FF0000"
       android:textColor="#AA000000"
       app:footerColor="#FFAA2222"
       app:footerLineHeight="1dp"
       app:footerIndicatorHeight="3dp"
       app:footerIndicatorStyle="underline"
       app:selectedColor="#FF000000"
       app:selectedBold="true"
       />

    <android.support.v4.view.ViewPager		//方式一:页面切换---页面下边TextView控制
        android:id="@+id/vp"
        android:layout_above="@+id/view"
        android:layout_below="@+id/pager_tab"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/green" />

    <View
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@android:color/darker_gray"
        android:layout_above="@+id/ll" />

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@android:color/background_light"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw"
            android:text="dddddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw2"
            android:text="ddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw3"
            android:text="ddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw4"
            android:text="ddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />
    </LinearLayout>
</RelativeLayout>
这里我直接采用两种方式控制页面切换,因为布局都差不多,所以我偷下懒就采用一个啦!

Activity中代码,重要的代码已经标出:
public class ViewPagerFragPagerIndicatorActivity extends BaseActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {

    private TextView tv1;
    private TextView tv2;
    private TextView tv3;
    private TextView tv4;
    private ViewPager viewPager;
    private List<View> viewsList;
    private List<Fragment> fragmentsList;
    private PagerSlidingTab pager_tab;
    private ArrayList<String> pagerTabs;
    private TabPageIndicator tabIndicator;
    private TitlePageIndicator titleIndicator;

    @Override
    protected void initView() {
        tv1 = (TextView) findViewById(R.id.tv1);
        tv2 = (TextView) findViewById(R.id.tv2);
        tv3 = (TextView) findViewById(R.id.tv3);
        tv4 = (TextView) findViewById(R.id.tv4);
        viewPager = (ViewPager) findViewById(R.id.vp);
//        pager_tab = (PagerSlidingTab) findViewById(R.id.pager_tab);  
//        tabIndicator = (TabPageIndicator) findViewById(R.id.pager_tab);
        titleIndicator = (TitlePageIndicator) findViewById(R.id.pager_tab);

        viewPager.addOnPageChangeListener(this);

        tv1.setOnClickListener(this);
        tv2.setOnClickListener(this);
        tv3.setOnClickListener(this);
        tv4.setOnClickListener(this);

        viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {

            @Override
            public void transformPage(View page, float position) {
                //执行pager切换动画
                ObjectAnimator.ofFloat(page, "scaleX", 1,0.3f,2,1).setDuration(1222).start();
            }
        });
    }

    @Override
    protected void initData() {
        preparData();
        tv1.setSelected(true);
        viewPager.setCurrentItem(0);

        viewPager.setAdapter(getAdapter(1));
//        pager_tab.setViewPager(viewPager);
//        pager_tab.setSmoothScrollingEnabled(true);
//        tabIndicator.setViewPager(viewPager);
//        tabIndicator.setCurrentItem(0);
        titleIndicator.setViewPager(viewPager);//indicator有关设置一
    }

    private void preparData() {
        viewsList = new ArrayList<View>();  //用于ViewPager
        fragmentsList = new ArrayList<Fragment>(); //用于FragmentViewPager
        pagerTabs = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            //这里必须要创建新的view,这样在后来Adapter中填充时,view的父控件才不会把这唯一的view删除没,这样才		   //能显示多个view效果
            View view = getLayoutInflater().from(ViewPagerFragPagerIndicatorActivity.this).inflate(R.layout.activity_second, new RelativeLayout(ViewPagerFragPagerIndicatorActivity.this));
            viewsList.add(i, view);
            pagerTabs.add("title" + i);
            fragmentsList.add(new MyPagerFragment("我是被选页面: 小" + i));
        }
    }

    @NonNull
    private PagerAdapter getAdapter(int i) {
        if (i == 1) {  //ViewPager配合View方式
            MyPagerAdapter pagerAdapter = new MyPagerAdapter(viewsList);
            //indicator有关设置二,其需要Adapter重写getPageTitle(int position)方法给indicator的title
            pagerAdapter.setPageTitle(pagerTabs);  
            return pagerAdapter;
        } else if (i == 2) {  //ViewPager配合Fragment方式
            MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentsList);
            pagerAdapter.setPageTitle(pagerTabs);
            return pagerAdapter;
        }
        return null;
    }

    @Override
    protected int getContentId() {
        return R.layout.frag_vp_indicator;
    }

    @Override
    public void onClick(View view) { //下边按钮点击事件监听
        changePager(view.getId());
    }

    private void changePager(int viewId) {
        tv1.setSelected(false);
        tv2.setSelected(false);
        tv3.setSelected(false);
        tv4.setSelected(false);

        switch (viewId) {
            case R.id.tv1:
                tv1.setSelected(true);
                viewPager.setCurrentItem(0, true);
                break;
            case R.id.tv2:
                viewPager.setCurrentItem(1, true);
                tv2.setSelected(true);
                break;
            case R.id.tv3:
                viewPager.setCurrentItem(2, true);
                tv3.setSelected(true);
                break;
            case R.id.tv4:
                viewPager.setCurrentItem(3, true);
                tv4.setSelected(true);
                break;
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {  //ViewPager页面滑动监听
        int tv = R.id.tv1;
        switch (position) {
            case 1:
                tv = R.id.tv2;
                break;
            case 2:
                tv = R.id.tv3;
                break;
            case 3:
                tv = R.id.tv4;
                break;
        }
        changePager(tv);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }
}
TitlePageIndicator只有两处重要设置,一个是titlePageIndicator.setViewPager(viewPager);另一个是ViewPager的Adapter中需要重写getPageTitle()方法,好让TitlePageIndicator去调用,基本使用设置仅此而已;

MyPagerAdapter中代码:
/**
 * (View)PagerAdapter:使用的时,要求填充View集合,而FragmentPagerAdapter使用时,
 * 要求填充的是Fragment集合,这点需要注意;
 */
public class MyPagerAdapter extends PagerAdapter {
    public List<View> viewList;
    private List<String> titlesList;

    public MyPagerAdapter(List<View> viewList) {
        this.viewList = viewList;
        if (viewList == null) {
            viewList = new ArrayList<>();
        }
    }

    @Override
    public int getCount() {
        return viewList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = viewList.get(position);
        if (view.getParent() !=null) {
            //去除view的父布局
            ViewGroup parent = (ViewGroup) view.getParent();
            parent.removeView(view);
        }
        container.addView(view);
        return view;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titlesList.get(position);
    }

    public void setPageTitle(List<String> titlesList){
        this.titlesList = titlesList;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
//        container.removeView((View) object); //已经remove过了,这里就不要再次remove了,
        //但这个方法必须重写,否则报错
    }
}

MyFragmentPagerAdapter中代码:
/**
 * (View)PagerAdapter:使用的时,要求填充View集合,而FragmentPagerAdapter使用时,要求填充的
 * 是Fragment集合,这点需要注意;
 */

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentsList;
    private List<String> titlesList;

    public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragmentsList) {
        super(fm);
        this.fragmentsList = fragmentsList;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = fragmentsList.get(position);
//        ((MyPagerFragment)fragment).initData(); //延后型数据加载模式,能节省流量
        return fragment;
    }                 

    @Override
    public int getCount() {
        return fragmentsList.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titlesList.get(position);
    }

    public void setPageTitle(List<String> titlesList){
        this.titlesList = titlesList;
    }
}

方法三:用Fragment(切换) + frameLayout,先看布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout	//此处替换ViewPager
        android:id="@+id/replace"
        android:background="@android:color/holo_blue_dark"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/background_light"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw"
            android:text="dddddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw2"
            android:text="ddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw3"
            android:text="ddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableTop="@drawable/selector_draw4"
            android:text="ddd"
            android:gravity="center"
            android:textColor="@color/selector_tv"
            android:textSize="14sp" />
    </LinearLayout>
</LinearLayout>


Activity中代码:
public class FramFragSlidTabActivity extends BaseActivity {
    @Bind(R.id.replace)
    FrameLayout frameLayout;
    @Bind(R.id.tv1)
    TextView tv1;
    @Bind(R.id.tv2)
    TextView tv2;
    @Bind(R.id.tv3)
    TextView tv3;
    @Bind(R.id.tv4)
    TextView tv4;
    @Bind(R.id.ll)
    LinearLayout ll;
    FragmentManager fragmentManager;
    private MyPagerFragment fragment;
    private android.support.v4.app.FragmentTransaction fragmentTransaction;
    private List<MyPagerFragment> fragmentsList;
    private Fragment currentFragment;

    @Override
    protected void initView() {
    }

    @Override
    protected void initData() {
        tv1.setSelected(true);
	  //这里要求Activity要用FragmentActivity子类
this.fragmentManager = getSupportFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentsList = new ArrayList<>(); for (int i = 0;i < 4;i++) { fragment = new MyPagerFragment("我是被选页面: 小 "+ i); fragmentsList.add(fragment); //初始化数据时就需要把全部页面都add进去,并使之都隐藏hide,然后进行单一的显示出来 fragmentTransaction.add(R.id.replace, fragment, "tag" + i) //默认显示最后add的Fragment .hide(fragment) .addToBackStack("backStack" + i); //添加到返回队列中 } currentFragment = fragmentsList.get(0); fragmentTransaction.show(fragmentsList.get(0)); fragmentTransaction.commitAllowingStateLoss(); } @Override protected int getContentId() { return R.layout.frag_fram; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ButterKnife.bind(this); } @OnClick({R.id.tv1, R.id.tv2, R.id.tv3, R.id.tv4}) public void onClick(View view) { switch (view.getId()) { case R.id.tv1: switchPager(0); break; case R.id.tv2: switchPager(1); break; case R.id.tv3: switchPager(2); break; case R.id.tv4: switchPager(3); break; } } private void switchPager(int i) { tv1.setSelected(false); tv2.setSelected(false); tv3.setSelected(false); tv4.setSelected(false); fragmentTransaction = fragmentManager.beginTransaction(); //每次页面切换都需要重新创建(开启) //事务,并且最后需要再次提交事务 fragmentTransaction.hide(currentFragment); switch(i) { case 0 : tv1.setSelected(true); break; case 1 : tv2.setSelected(true); break; case 2 : tv3.setSelected(true); break; case 3 : tv4.setSelected(true); break; } fragmentTransaction.show(fragmentsList.get(i)); currentFragment = fragmentsList.get(i); fragmentTransaction.commitAllowingStateLoss(); //最后需要提交事务,且每个事务都只能被提交一次 }}


  

代码中重要地方都已注释,使用的时候注意下就可以啦! 
 相关文档: Fragment详解之管理Fragment

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值