Android 底部导航总结

jopen 9年前

实现android 底部导航的方式有好几种如:fragment:、TabActivity、ViewGroup、viewPager等,

这里介绍使用viewPager实现底部导航。

先说说使用viewPager实现的原因

1、fragment

a  我们需要使用fragment的话,我们只能用v4包里面的fragment,因为我们需要向下兼容。
b  当我们用V4包里面的fragment的时候,系统会自动添加一个节点。
c  fragment不允许嵌套fragmentd  这个谷歌是在4.2里面才解决的。假如我的SDK的版本不进行更新的话,是找不到这个方法的。  

android.support.v4.app的Fragment中找不到getChildFragmentManager()方法
2、viewPager:

a  因为使用起来方便。
3、TabActivity:
a TabActivity  过时,直接使用fragment 即可
b Activity是android里面的四大组件。是重量级的组件,fragment是android里面的片段,是特殊的view,他具备生命周期。
4、ViewGroup :

a :属于低级组件。比较麻烦。
首先自定义懒加载的viewpager,目的是 :不需要让viewpage默认加载下一页。
查看ViewPager的源码发现有这么一个变量DEFAULT_OFFSCREEN_PAGES   控制加载页面的个数

private static final int DEFAULT_OFFSCREEN_PAGES = 1;//默认加载page的大小   
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
final int pageLimit = mOffscreenPageLimit;
final int startPos = Math.max(0, mCurItem - pageLimit); 
final int N = mAdapter.getCount();
final int endPos = Math.min(N-1, mCurItem + pageLimit);

当DEFAULT_OFFSCREEN_PAGES=1时  选择第一个pager时,即mCurItem =0时  假如说一共有3个页面 N=3

startPos = Math.max(0, mCurItem - pageLimit);    startPos=0

endPos = Math.min(N-1, mCurItem + pageLimit);  endPos=1

当DEFAULT_OFFSCREEN_PAGES=1时  选择第二个pager时,即mCurItem =1时  假如说一共有3个页面 N=3

startPos = Math.max(0, mCurItem - pageLimit);    startPos=1

endPos = Math.min(N-1, mCurItem + pageLimit);  endPos=2

当DEFAULT_OFFSCREEN_PAGES=1时  选择第三个pager时,即mCurItem =2时  假如说一共有3个页面 N=3

startPos = Math.max(0, mCurItem - pageLimit);    startPos=2

endPos = Math.min(N-1, mCurItem + pageLimit);  endPos=2

故若想实现不需要让viewpage默认加载下一页,只需更改变量值为0即可。

private static final int DEFAULT_OFFSCREEN_PAGES = 0;//默认的加载页面,ViewPager是1个,所以会加载两个Fragment

当DEFAULT_OFFSCREEN_PAGES=0时  选择第一个pager时,即mCurItem =0时  假如说一共有3个页面 N=3

startPos = Math.max(0, mCurItem - pageLimit);    startPos=0

endPos = Math.min(N-1, mCurItem + pageLimit);  endPos=0

当DEFAULT_OFFSCREEN_PAGES=0时  选择第二个pager时,即mCurItem =1时  假如说一共有3个页面 N=3

startPos = Math.max(0, mCurItem - pageLimit);    startPos=1

endPos = Math.min(N-1, mCurItem + pageLimit);  endPos=1

当DEFAULT_OFFSCREEN_PAGES=0时  选择第三个pager时,即mCurItem =2时  假如说一共有3个页面 N=3

startPos = Math.max(0, mCurItem - pageLimit);    startPos=2

endPos = Math.min(N-1, mCurItem + pageLimit);  endPos=2

解决了ViewPager预加载的问题,下面解决禁止ViewPager滑动

重写两个方法就可以禁止ViewPager滑动了,如果想实现可以滑动 将变量setTouchMode改为true即可。

private boolean setTouchMode = false;    @Override        public boolean onInterceptTouchEvent(MotionEvent ev) {            if (setTouchMode)                return super.onInterceptTouchEvent(ev);            else                return false;        }        @Override        public boolean onTouchEvent(MotionEvent ev) {            if(setTouchMode)               return super.onTouchEvent(ev);            else                return false;        }  

下面是主页面的布局代码activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:orientation="vertical" >                    <view                android:id="@+id/viewpager"                android:layout_width="match_parent"                android:layout_height="0dip"                android:layout_weight="1.0"                class="com.yuweiguo.bottomnavibyviewpager.view.MyViewPager" />                    <RadioGroup                android:id="@+id/main_radio"                android:layout_width="fill_parent"                android:layout_height="60dp"                android:layout_gravity="bottom"                android:background="#133575"                android:gravity="center_vertical"                android:orientation="horizontal"                android:paddingTop="2dp" >                        <RadioButton                    android:id="@+id/rb_navi"                    style="@style/main_tab_bottom"                    android:drawableTop="@drawable/tab_selector1" />                        <RadioButton                    android:id="@+id/rb_routeplan"                    style="@style/main_tab_bottom"                    android:drawableTop="@drawable/tab_selector2" />                        <RadioButton                    android:id="@+id/rb_location"                    style="@style/main_tab_bottom"                    android:drawableTop="@drawable/tab_selector3" />                        <RadioButton                    android:id="@+id/rb_setting"                    style="@style/main_tab_bottom"                    android:drawableTop="@drawable/tab_selector4" />            </RadioGroup>                </LinearLayout>  

MainActivity.java 源代码
    package com.yuweiguo.bottomnavibyviewpager;                import java.util.ArrayList;        import java.util.List;                import android.app.Activity;        import android.content.Intent;        import android.os.Bundle;        import android.support.v4.view.PagerAdapter;        import android.view.KeyEvent;        import android.view.View;        import android.view.ViewGroup;        import android.widget.RadioGroup;        import android.widget.RadioGroup.OnCheckedChangeListener;        import android.widget.Toast;                import com.yuweiguo.bottomnavibyviewpager.base.BasePager;        import com.yuweiguo.bottomnavibyviewpager.pager.MessagePager;        import com.yuweiguo.bottomnavibyviewpager.pager.NaviPager;        import com.yuweiguo.bottomnavibyviewpager.pager.RouteplanPager;        import com.yuweiguo.bottomnavibyviewpager.pager.SearchPager;        import com.yuweiguo.bottomnavibyviewpager.view.LazyViewPager.OnPageChangeListener;        import com.yuweiguo.bottomnavibyviewpager.view.MyViewPager;                public class MainActivity extends Activity {            private MyViewPager viewpager;            private RadioGroup main_radio;            private List<BasePager> pages = new ArrayList<BasePager>();            private ViewPageAdapter viewPageAdapter;            private int currentItem = R.id.rb_navi;            private int oldPosition = 2;                    public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                viewpager = (MyViewPager) findViewById(R.id.viewpager);                main_radio = (RadioGroup) findViewById(R.id.main_radio);                pages.clear();                pages.add(new NaviPager(this));                pages.add(new RouteplanPager(this));                pages.add(new SearchPager(this));                pages.add(new MessagePager(this));                viewPageAdapter = new ViewPageAdapter(pages);                viewpager.setAdapter(viewPageAdapter);                viewpager.setOnPageChangeListener(new OnPageChangeListener() {                            @Override                    public void onPageSelected(int position) {                        BasePager pager = pages.get(position);                        pager.onResume();                        pager.initData();                    }                            @Override                    public void onPageScrolled(int position, float positionOffset,                            int positionOffsetPixels) {                            }                            @Override                    public void onPageScrollStateChanged(int state) {                            }                });                main_radio.setOnCheckedChangeListener(new OnCheckedChangeListener() {                            @Override                    public void onCheckedChanged(RadioGroup group, int checkedId) {                        switch (checkedId) {                        case R.id.rb_navi:                            if (oldPosition != 0) {                                pages.get(oldPosition).onPause();                                oldPosition = 0;                            }                            viewpager.setCurrentItem(0, false);                            break;                        case R.id.rb_routeplan:                            if (oldPosition != 1) {                                pages.get(oldPosition).onPause();                                oldPosition = 1;                            }                            viewpager.setCurrentItem(1, false);                            break;                        case R.id.rb_location:                            if (oldPosition != 2) {                                pages.get(oldPosition).onPause();                                oldPosition = 2;                            }                            viewpager.setCurrentItem(2, false);                            break;                        case R.id.rb_setting:                            if (oldPosition != 3) {                                pages.get(oldPosition).onPause();                                oldPosition = 3;                            }                            viewpager.setCurrentItem(3, false);                            break;                        }                        currentItem = checkedId;                    }                });                main_radio.check(currentItem);                    }                    @Override            protected void onResume() {                super.onResume();                pages.get(oldPosition).onResume();            }                    @Override            protected void onPause() {                super.onPause();                pages.get(oldPosition).onPause();            }                    public class ViewPageAdapter extends PagerAdapter {                private List<BasePager> list;                        public ViewPageAdapter(List<BasePager> pages) {                    this.list = pages;                }                        @Override                public void destroyItem(ViewGroup container, int position, Object object) {                    ((MyViewPager) container).removeView(list.get(position)                            .getRootView());                }                        @Override                public Object instantiateItem(ViewGroup container, int position) {                    ((MyViewPager) container).addView(list.get(position).getRootView(),                            0);                    return list.get(position).getRootView();                }                        @Override                public int getCount() {                    return list.size();                }                        @Override                public boolean isViewFromObject(View arg0, Object arg1) {                    return arg0 == arg1;                }            }                            @Override            protected void onDestroy() {                if (pages != null) {                    for (BasePager pager : pages) {                        pager.onDestroy();                    }                }                super.onDestroy();            }                }  


最后上效果图




最后  献上免费源码http://download.csdn.net/detail/gfbgl/8196027

来自:http://blog.csdn.net/growth58/article/details/41477079