android循序渐进:1、首页与底部导航栏实现

app首页布局常采用底部三个或四个导航按钮,并支持左右滑动切换如微信、钉钉,

本文记录采用PagerView+BottomNavigationBar实现底部导航与左右翻页效果。

效果图如下:

1、增加图片资源

图片资源采用vector格式,底部四个图片代码如下

首页

<vector android:height="24dp" android:viewportHeight="1024.0"
    android:viewportWidth="1024.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#929292" android:pathData="M949.1,519.3 L508.7,107.6 68.3,518.1c-8.6,8 -9.1,21.5 -1,30.1 8,8.6 21.6,9.1 30.2,1l411.2,-383.3 411.2,384.5c4.1,3.9 9.4,5.8 14.6,5.8 5.7,0 11.4,-2.3 15.6,-6.8C958.1,540.9 957.7,527.4 949.1,519.3L949.1,519.3zM949.1,519.3M814.7,527.8c-11.8,0 -21.3,9.6 -21.3,21.3l0,327L622.6,876.2 622.6,648.7 394.8,648.7l0,227.5L224,876.2 224,549.1c0,-11.8 -9.6,-21.3 -21.3,-21.3 -11.8,0 -21.4,9.6 -21.4,21.3l0,369.7 256.2,0L437.5,691.3l142.3,0 0,227.5 256.2,0L836,549.1C836,537.4 826.5,527.8 814.7,527.8L814.7,527.8zM814.7,527.8M665.3,222.1l128.1,0 0,113.7c0,11.8 9.6,21.3 21.3,21.3 11.8,0 21.3,-9.5 21.3,-21.3L836,179.4 665.3,179.4c-11.8,0 -21.4,9.5 -21.4,21.3C643.9,212.6 653.5,222.1 665.3,222.1L665.3,222.1zM665.3,222.1"/>
</vector>

功能

<vector android:height="24dp" android:viewportHeight="1024.0"
    android:viewportWidth="1024.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M448,102.4L128,102.4c-19.2,0 -32,12.8 -32,32v320c0,19.2 12.8,32 32,32h320c19.2,0 32,-12.8 32,-32v-320c0,-19.2 -12.8,-32 -32,-32zM448,454.4L128,454.4v-320h320v320zM736,486.4c105.6,0 192,-86.4 192,-192s-86.4,-192 -192,-192 -192,86.4 -192,192 86.4,192 192,192zM576,294.4c0,-89.6 70.4,-160 160,-160s160,70.4 160,160 -70.4,160 -160,160 -160,-73.6 -160,-160zM896,550.4L576,550.4c-19.2,0 -32,12.8 -32,32v320c0,19.2 12.8,32 32,32h320c19.2,0 32,-12.8 32,-32v-320c0,-19.2 -12.8,-32 -32,-32zM896,902.4L576,902.4v-320h320v320zM448,550.4L128,550.4c-19.2,0 -32,12.8 -32,32v320c0,19.2 12.8,32 32,32h320c19.2,0 32,-12.8 32,-32v-320c0,-19.2 -12.8,-32 -32,-32zM448,902.4L128,902.4v-320h320v320z"/>
</vector>

数据

<vector android:height="24dp" android:viewportHeight="1024.0"
    android:viewportWidth="1024.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M191,864c0,17.7 -14.3,32 -32,32l0,0c-17.7,0 -32,-14.3 -32,-32L127,160c0,-17.7 14.3,-32 32,-32l0,0c17.7,0 32,14.3 32,32L191,864z"/>
    <path android:fillColor="#FF000000" android:pathData="M159,896c-17.7,0 -32,-14.3 -32,-32l0,0c0,-17.7 14.3,-32 32,-32l712,0c17.7,0 32,14.3 32,32l0,0c0,17.7 -14.3,32 -32,32L159,896z"/>
    <path android:fillColor="#FF000000" android:pathData="M307.1,686.3c-12.4,12.4 -32.4,12.4 -44.8,0l0,0c-12.4,-12.4 -12.4,-32.4 0,-44.8l173.4,-173.4c12.4,-12.4 32.4,-12.4 44.8,0l0,0c12.4,12.4 12.4,32.4 0,44.8L307.1,686.3z"/>
    <path android:fillColor="#FF000000" android:pathData="M608.8,640c-12.4,12.4 -32.4,12.4 -44.8,0l0,0c-12.4,-12.4 -12.4,-32.4 0,-44.8l212.7,-212.7c12.4,-12.4 32.4,-12.4 44.8,0l0,0c12.4,12.4 12.4,32.4 0,44.8L608.8,640z"/>
    <path android:fillColor="#FF000000" android:pathData="M608,595.3c12.4,12.4 12.4,32.4 0,44.8l0,0c-12.4,12.4 -32.4,12.4 -44.8,0L436,512.8c-12.4,-12.4 -12.4,-32.4 0,-44.8l0,0c12.4,-12.4 32.4,-12.4 44.8,0L608,595.3z"/>
</vector>

我的

<vector android:height="24dp" android:viewportHeight="1024.0"
    android:viewportWidth="1024.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M512,39.4c-260.9,0 -472.5,211.5 -472.5,472.5S251.1,984.3 512,984.3s472.5,-211.5 472.5,-472.5S772.9,39.4 512,39.4zM512,941.4c-237.3,0 -429.6,-192.3 -429.6,-429.6 0,-237.3 192.3,-429.6 429.6,-429.6s429.6,192.3 429.6,429.6C941.6,749.1 749.3,941.4 512,941.4z"/>
    <path android:fillColor="#FF000000" android:pathData="M792.4,862.5c-0.1,-0.9 -0.2,-1.8 -0.3,-2.8 -0,-2 -0.3,-3.9 -0.7,-5.8 -13.1,-103 -80.4,-189 -172.5,-228.6 53.2,-36.4 88.1,-97.6 88.1,-166.9 0,-111.7 -90.6,-202.2 -202.2,-202.2 -111.7,0 -202.2,90.5 -202.2,202.2 0,69.4 34.9,130.6 88.1,167 -91,39.2 -157.9,123.9 -171.9,225.4 -1,3 -1.6,6.1 -1.6,9.4l0.2,2.2c0,0 -0,0.1 -0,0.1l0,0 0,0.3c0,15.9 12.9,28.8 28.8,28.8 15.9,0 28.8,-12.9 28.8,-28.8l-0,-0.3 0.5,0c13.4,-110.1 104.4,-196.3 216.6,-202.3 4.2,0.3 8.4,0.4 12.6,0.4 4.2,0 8.4,-0.1 12.6,-0.4 112.3,6 203.2,92.2 216.7,202.3l0.6,0 0,0.3c0,15.9 12.9,28.8 28.8,28.8s28.8,-12.9 28.8,-28.8l-0,-0.3L792.4,862.5 792.4,862.5zM504.8,602.8c-79.8,0 -144.4,-64.7 -144.4,-144.4 0,-79.8 64.7,-144.5 144.4,-144.5s144.4,64.7 144.4,144.5C649.2,538.1 584.5,602.8 504.8,602.8L504.8,602.8zM504.8,602.8"/>
</vector>

 2、首页布局 activity_main.xml

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".activity.MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpagerFrame"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.ashokvarma.bottomnavigation.BottomNavigationBar
        android:id="@+id/bottom_navigation_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom" />
</LinearLayout>

3、MainActivity 代码

public class MainActivity extends BaseActivity {
    @BindView(R.id.bottom_navigation_bar)
    BottomNavigationBar mBottomNavigationBar;
    @BindView(R.id.viewpagerFrame)
    ViewPager mViewPagerFrame;
    private List<BaseFragment> fragments;
    BadgeItem numberBadgeItem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initBottomNavigationBar();
        initViewPagerFrame();


    }

    //region 界面初始化

    /**
     * 初始化底部导航栏
     *
     * @author baimch   2017/4/21 14:06
     */
    private void initBottomNavigationBar() {
        mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
        mBottomNavigationBar
                .setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
        mBottomNavigationBar
                .setInActiveColor(R.color.nav_InActive)
                .setBarBackgroundColor(R.color.nav_BarBackground);
        numberBadgeItem = new BadgeItem()
                .setBorderWidth(4)
                .setText("5");
        mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_nav_home, R.string.nav_first))
                .addItem(new BottomNavigationItem(R.drawable.ic_nav_func, R.string.nav_second))
                .addItem(new BottomNavigationItem(R.drawable.ic_nav_data, R.string.nav_third))
                .addItem(new BottomNavigationItem(R.drawable.ic_nav_myself, R.string.nav_forth).setBadgeItem(numberBadgeItem))
                .setFirstSelectedPosition(0)
                .initialise();
        mBottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
            @Override
            public void onTabSelected(int position) {
                if (fragments != null) {
                    if (position < fragments.size()) {
                        mViewPagerFrame.setCurrentItem(position);
                        if (position == 3) {
                            //如果点击我的 隐藏消息数值
                            numberBadgeItem.hide();
                        }
                    }
                }
            }

            @Override
            public void onTabUnselected(int position) {

            }

            @Override
            public void onTabReselected(int position) {

            }
        });
    }

    /**
     * 初始化ViewPager
     *
     * @author baimch   2017/4/21 14:05
     */
    private void initViewPagerFrame() {
        fragments = getFragments();
        mViewPagerFrame.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                mBottomNavigationBar.selectTab(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        mViewPagerFrame.setAdapter(new BasePageAdapter(getSupportFragmentManager(), fragments));
    }
    //endregion

    /**
     * 获取首页界面列表
     *
     * @return fragment列表
     * @author baimch  2017/4/21 14:04
     */
    private ArrayList<BaseFragment> getFragments() {
        ArrayList<BaseFragment> fragments = new ArrayList<>();
        fragments.add(new Main_HomeFragment());
        fragments.add(new Main_FuncFragment());
        fragments.add(new Main_DataFragment());
        fragments.add(new Main_MySelfFragment());
        return fragments;
    }
}

适配器

public class BasePageAdapter extends FragmentPagerAdapter {
    private List<BaseFragment> mFragments;

    public BasePageAdapter(FragmentManager fm, List<BaseFragment> mFragments) {
        super(fm);
        this.mFragments = mFragments;
    }

    @Override
    public Fragment getItem(int position) {//必须实现
        return mFragments.get(position);
    }

    @Override
    public int getCount() {//必须实现
        return mFragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {//选择性实现
        return mFragments.get(position).getClass().getSimpleName();
    }
}

4、三个Fragment,仅以一个举例

public class Main_HomeFragment extends BaseFragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_mainhome, null);
        return view;
    }
}

 

posted @ 2017-04-24 11:29  baimch  阅读(748)  评论(0编辑  收藏  举报