Android 控件BottomNavigationView的使用

 

一、项目的导入

在build引入:

implementation 'com.android.support:design:26.1.0'

后面的版本号根据SDK的版本改写如:

implementation 'com.android.support:appcompat-v7:26.1.0'则使用“26.1.0”

二、现在我们可以用一个例子来说明:

 

1.先activity_main.xml进行布局的设置如下:

 

    

    

2.为了实现以上的效果,先要进行每个tab的布局以及代码的编写:

tab.xml的布局如下:



    

由于我们有4个界面,所以就要进行创建4个这样的布局,只是显示的字体的颜色不同,其实就是为了显示效果不一样;由于比较懒就不一 一贴出。

2.TabFragment代码的编写,其实也是很简单;主要是实现显示每个fragment就OK了

public class Tab1Fragment extends Fragment {

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

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

这样Fragment已经创建完成,接下来要创建个menu的布局,此menu的文件命名为test_menu,so在使用的时候则是app:test_menu;



    

    

    

    

3.创建viewPager的适配器,BottomAdapter

public class BottomAdapter extends FragmentPagerAdapter {

    private List fragments = new ArrayList<>();

    public BottomAdapter(FragmentManager fm){
        super(fm);
    }
    @Override
    public Fragment getItem(int position){
        return fragments.get(position);
    }
    @Override
    public int getCount(){
        return fragments.size();
    }
    public void addFragment(Fragment fragment){
        fragments.add(fragment);
    }
}

7.为了完成最终的效果,则在activity_main.xml中加上了ViewPager的布局如下:

    

    

8.最后放出最后的大招,MainActivity的完整代码如下:

public class MainActivity extends AppCompatActivity {

    private BottomNavigationView mBv;
    private ViewPager mVp;

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

    private void initView(){
        mBv = (BottomNavigationView)findViewById(R.id.bv);
        mVp = (ViewPager) findViewById(R.id.vp);

        BottomNavigationViewHelper.disableShiftMode(mBv);

        mBv.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()){
                    case R.id.item_tab1:
                        mVp.setCurrentItem(0);
                        return true;

                    case R.id.item_tab2:
                        mVp.setCurrentItem(1);
                        return true;

                    case R.id.item_tab3:
                        mVp.setCurrentItem(2);
                        return true;

                    case R.id.item_tab4:
                        mVp.setCurrentItem(3);
                        return true;


                }

                return false;
            }
        });

        setupViewPage(mVp);

        mVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                mBv.getMenu().getItem(position).setChecked(true);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void setupViewPage(ViewPager viewPager){
        BottomAdapter adapter = new BottomAdapter(getSupportFragmentManager());
        adapter.addFragment(new TabFragment());
        adapter.addFragment(new Tab1Fragment());
        adapter.addFragment(new Tab2Fragment());
        adapter.addFragment(new Tab3Fragment());
        viewPager.setAdapter(adapter);
    }

}

在这里MainActivity中用到了BottomNavigationViewHelper进行动画效果的设置,二这个类的代码如下:

public class BottomNavigationViewHelper {

    public static void disableShiftMode(BottomNavigationView view){
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView,false);
            shiftingMode.setAccessible(false);
            for (int i = 0;i < menuView.getChildCount();i++){
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                item.setShiftingMode(false);
                item.setChecked(item.getItemData().isChecked());
            }
        }catch (NoSuchFieldException e){
            Log.e("bnHelper","unable to get shift mode field",e);
        }catch (IllegalAccessException e){
            Log.e("bnHelper","unable to change value shift mode",e);

        }
    }
}

老铁们到这里,这个简单的使用例子已经完成了。

现在总结下这个BottomNavigationView的一些其他的问题:底部Bottom选项,最少为3项,超过3项之后,BottomNavigationView会自动使用本身控件的自带动画属性,同时最多好像为5项

这只是简单的使用,也许会有后续。。。。。

最后附上这个demo的完整代码的地址:https://github.com/brusewu/BottomNavigationView-demo

你可能感兴趣的:(android)