《BottomNavigationView》底部导向栏 和 《viewPager》的结合使用

今天没事干,学习了一下App内部通用的底部导向栏如果使用
**1 首先我使用的是,android 28API, 其实早android 25之后就有这个控件了 BottomNavigationView,主要也就是学会如何使用这个控件,好了废话少说,上代码 **

在这里插入图片描述

主要代码就在ButtomBar.java里

package com.example.lisiwei.bottomnavigationviewdemo;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class ButtomBar extends AppCompatActivity {

    private TextView mTextMessage;
    private CustomViewPager mViewPager;
    private MenuItem mMenuItem = null;
    private List<Fragment> mFragments = new ArrayList<>();
    private BottomNavigationView mNavigationView = null;
    // 重写BottomNavigatinView中的OnNavigationItemSelectedListener监听,然后在onCreate中进行注册。
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        // 这里的item就是menu文件中的navigation的中的item控件。
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            mMenuItem = item;
            switch (item.getItemId()) {
                // 当点击到导向栏的第一个button是就会走ViewPager中对应的第一个view,下面的依次类推。
                case R.id.navigation_first:
                    mViewPager.setCurrentItem(0);
                    return true;
                case R.id.navigation_second:
                    mViewPager.setCurrentItem(1);
                    return true;
                case R.id.navigation_third:
                    mViewPager.setCurrentItem(2);
                    return true;
                case R.id.navigation_four:
                    mViewPager.setCurrentItem(3);
                    return true;
                    default:
                        return false;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buttom_bar);

        mNavigationView = findViewById(R.id.navigation);
        mTextMessage = (TextView) findViewById(R.id.message);
        mNavigationView = (BottomNavigationView) findViewById(R.id.navigation);
        // 注册上面的接口实现
        mNavigationView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        init();
    }

    private void init() {
        // 这里的CustomViewPager是Viewpager的子类,主要在里面做了一件事就是开启或者禁止viewPager的滑动
        mViewPager = (CustomViewPager) findViewById(R.id.viewpager);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                // 这里面应该是选中Item之后,也就是进入到了当前的ViewPager里面做的一些事情。

            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
        // 将所有的viewPager子类都add到Fragment list中
        mFragments.add(new FisrtFragment());
        mFragments.add(new SecondFragment());
        mFragments.add(new ThridFragment());
        mFragments.add(new FourthFragment());
        // 这个是将fragment list传给 viewPager的适配子类行进管理
        BottomViewAdapter adapter = new BottomViewAdapter(getSupportFragmentManager(), mFragments);
        mViewPager.setAdapter(adapter);
        //表示当前View Item的左边和右边的View item处于被创建,其他的view item已经创建了,则被销毁,没有被创建也不会创建,为2依次类推
        mViewPager.setOffscreenPageLimit(1);
        // 这个是自己定义的一个接口开启或者禁止viewPager的滑动
        mViewPager.setScanScroll(false);
    }

}

2 Viewpager的子类 CustomViewPager.java自己定义了一个接口。是否需要滑动

package com.example.lisiwei.bottomnavigationviewdemo;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class CustomViewPager extends ViewPager {
    private boolean isCanScroll = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 设置其是否能滑动换页
     * @param isCanScroll false 不能换页, true 可以滑动换页
     */
    public void setScanScroll(boolean isCanScroll) {
        this.isCanScroll = isCanScroll;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return isCanScroll && super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return isCanScroll && super.onTouchEvent(ev);

    }

}

3 FragmentPagerAdapter的子类 BottomViewAdapter.java 此类主要就是对ViewPager 中的View item进行管理

package com.example.lisiwei.bottomnavigationviewdemo;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import java.util.List;

public class BottomViewAdapter extends FragmentPagerAdapter {

    private List<Fragment> mFragmentList;

    public BottomViewAdapter(FragmentManager manager, List<Fragment> mFragmentList) {
        super(manager);
        this.mFragmentList = mFragmentList;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

4 这个就是viewPager中加载的View item

package com.example.lisiwei.bottomnavigationviewdemo;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FisrtFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.firstfragment, container, false);
        Log.d("lisiwei" ,"第一个fragment创建");
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("lisiwei" ,"第一个fragment销毁");
    }
}

这里一共有4个继承自Fragment的View Pager加载类,其他的自己创建new 一下add到list 中就可以了。
如果又不懂的可以直接@我,大家一起共同学习
完整的代码下载路径:https://download.csdn.net/download/lisiwei1994/10851190

在这里插入图片描述

发布了14 篇原创文章 · 获赞 4 · 访问量 3519

猜你喜欢

转载自blog.csdn.net/lisiwei1994/article/details/85007391
今日推荐