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
    好,到这里代码已经完成,如果有问题请留言
  • 相关阅读:
    NET Framework Library Source Code Now Available
    [笔记] C# 3.0 新特性[2]Understanding Extension Methods
    [笔记] C# 3.0 新特性[3]Understanding Object Initializers
    Tips: Save some typing when binding values to UI in WPF/Silverlight
    Test Driven Development
    How Default Parameter Works When It Comes Overload Method
    ASP.NET MVC 3 Refresh
    Avoid to use "IN", "NOT IN" in SQL statement, try to use "LEFT JOIN" instead.
    C# Rules
    Parameter sniffing may cause negative impact on performance
  • 原文地址:https://www.cnblogs.com/Nigeria/p/10368645.html
Copyright © 2011-2022 走看看