zoukankan      html  css  js  c++  java
  • BottomNavigationView的使用与碰到的坑

    花了两个小时,晕乎乎的,终于搞完了,废话不多说,直接上代码。。。

    坑点:BottomNavigationView在使用此控件时需要依赖25.3.1-27.1.0之间的版本,当然,目前最高版本支支持到27.1.0

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

    具体使用:网上有各种写法均可使用,我这里就不多说了简单吧代码给贴上,当然一些资源图片我就不给了

    layout布局文件下activity_home.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_navigation" />

    <android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemIconTint="@drawable/bottom_navigation_selector"
    app:itemTextColor="@drawable/bottom_navigation_selector"
    app:menu="@menu/menu_bottom_navigation" />

    <View
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:layout_above="@id/bottom_navigation"
    android:background="@drawable/bottom_shadow" />

    </RelativeLayout>

    fragment_base.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>

    </RelativeLayout>


    values文件下values.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <dimen name="design_bottom_navigation_active_text_size">14dp</dimen>
    <dimen name="design_bottom_navigation_text_size">14dp</dimen>
    </resources>

    drawable文件下
    bottom_navigation_selector.xml
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/tab_checked" android:state_checked="true" />
    <item android:color="@color/tab_unchecked" android:state_checked="false" />
    </selector>


    bottom_shadow.xml
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
    android:angle="90"
    android:endColor="#0000"
    android:startColor="#30000000"
    android:type="linear"/>

    </shape>



    menu文件夹下
    menu_bottom_navigation.xml
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
    android:id="@+id/item_news"
    android:icon="@mipmap/ic_news_gray"
    android:title="新闻" />
    <item
    android:id="@+id/item_lib"
    android:icon="@mipmap/ic_library_gray"
    android:title="图书" />

    <item
    android:id="@+id/item_find"
    android:icon="@mipmap/ic_discovery_gray"
    android:title="发现" />

    </menu>


    资源文件基本就这些,还有一些图片和色值就不贴了
    Java代码:
    HomeActivity.java

    package com.jlj.bottomnavigationdemo;

    import android.annotation.SuppressLint;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.design.widget.BottomNavigationView;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.view.MenuItem;
    import android.view.MotionEvent;
    import android.view.View;

    /**
    * Created by jlj on 2019/2/13.
    * HomeActivity 主界面
    */

    public class HomeActivity extends AppCompatActivity {

    private ViewPager viewPager;
    private MenuItem menuItem;
    private BottomNavigationView bottomNavigationView;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation);
    //默认 >3 的选中效果会影响ViewPager的滑动切换时的效果,故利用反射去掉
    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
    bottomNavigationView.setOnNavigationItemSelectedListener(
    new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
    case R.id.item_news:
    viewPager.setCurrentItem(0);
    break;
    case R.id.item_lib:
    viewPager.setCurrentItem(1);
    break;
    case R.id.item_find:
    viewPager.setCurrentItem(2);
    break;
    }
    return false;
    }
    });

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

    }

    @Override
    public void onPageSelected(int position) {
    if (menuItem != null) {
    menuItem.setChecked(false);
    } else {
    bottomNavigationView.getMenu().getItem(0).setChecked(false);
    }
    menuItem = bottomNavigationView.getMenu().getItem(position);
    menuItem.setChecked(true);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }
    });

    // 禁止ViewPager滑动
    viewPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    return true;
    }
    });

    setupViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

    adapter.addFragment(BaseFragment.newInstance("新闻"));
    adapter.addFragment(BaseFragment.newInstance("图书"));
    adapter.addFragment(BaseFragment.newInstance("发现"));
    viewPager.setAdapter(adapter);
    }
    }
      

    ViewPagerAdapter.java
    package com.fedming.bottomnavigationdemo;

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

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

    /**
    * Created by jlj on 2019/2/13.
    * ViewPagerAdapter
    */

    public class ViewPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
    super(manager);
    }

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

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

    public void addFragment(Fragment fragment) {
    mFragmentList.add(fragment);
    }

    }
    BottomNavigationViewHelper.java
    package com.fedming.bottomnavigationdemo;

    import android.support.design.internal.BottomNavigationItemView;
    import android.support.design.internal.BottomNavigationMenuView;
    import android.support.design.widget.BottomNavigationView;

    import java.lang.reflect.Field;

    // 利用反射,改变 item mShiftingMode 的值
    public class BottomNavigationViewHelper {

    public static void disableShiftMode(BottomNavigationView navigationView) {

    BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.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 itemView = (BottomNavigationItemView) menuView.getChildAt(i);
    itemView.setShiftingMode(false);
    itemView.setChecked(itemView.getItemData().isChecked());
    }

    } catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
    }
    }
    }


    BaseFragment.java
    package com.fedming.bottomnavigationdemo;

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.design.widget.Snackbar;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    /**
    * Created by jlj on 2019/2/13.
    * BaseFragment
    */

    public class BaseFragment extends Fragment {
    public static BaseFragment newInstance(String info) {
    Bundle args = new Bundle();
    BaseFragment fragment = new BaseFragment();
    args.putString("info", info);
    fragment.setArguments(args);
    return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_base, null);
    TextView tvInfo = (TextView) view.findViewById(R.id.textView);
    tvInfo.setText(getArguments().getString("info"));
    tvInfo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Snackbar.make(v, "Don't click me.please!.", Snackbar.LENGTH_SHORT).show();
    }
    });
    return view;
    }
    }
    去除动画效果,水波纹效果,建议参考:
    https://www.jianshu.com/p/dd31d7f07b2d
    好,到这里代码已经完成,如果有问题请留言
  • 相关阅读:
    js对象数组(JSON) 根据某个共同字段 分组
    一个 函数 用来转化esSearch 的range 条件
    关于 vuex 报错 Do not mutate vuex store state outside mutation handlers.
    android listview 重用view导致的选择混乱问题
    android SDK和ADT的更新
    Android中adb push和adb install的使用区别
    pycharm中添加扩展工具pylint
    su Authentication failure解决
    Putty以及adb网络调试
    有关android源码编译的几个问题
  • 原文地址:https://www.cnblogs.com/Nigeria/p/10368645.html
Copyright © 2011-2022 走看看