BottomNavigation+ViewPager實現App底部切換頁面

<com.geniusphone.xdd.weight.NoScrollViewPager
        android:id="@+id/vp_home_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:elevation="15dp"
        android:background="#fff"
        app:itemIconSize="21dp"
        app:itemTextColor="@color/home_tab_text_color"
        app:menu="@menu/home_bottom_tab" />
 		homeNavView = findViewById(R.id.bottomNavigationView);
        mViewPager = findViewById(R.id.vp_home_pager);
        homeNavView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
        homeNavView.setItemHorizontalTranslationEnabled(false);
        homeNavView.setItemIconTintList(null);
        homeNavView.setSelectedItemId(R.id.item_home);
  // 設置默認進來是tab 顯示的頁面
    private void setDefaultFragment() {
        mPagerAdapter = new BaseFragmentAdapter<>(this);
        mPagerAdapter.addFragment(HomeFragment.newInstance());
        mPagerAdapter.addFragment(FindFragment.newInstance());
        mPagerAdapter.addFragment(MineFragment.newInstance());
        mViewPager.setAdapter(mPagerAdapter);
        // 限制頁面數量
        mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount());
    }
homeNavView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                fragmentManager = getSupportFragmentManager();
                transaction = fragmentManager.beginTransaction();
                switch (item.getItemId()) {
                    case R.id.item_home:
                        mPagerAdapter.setCurrentItem(HomeFragment.class);
                        return true;
                    case R.id.item_find:
                        mPagerAdapter.setCurrentItem(FindFragment.class);
                        return true;
                    case R.id.item_mine:
                        mPagerAdapter.setCurrentItem(MineFragment.class);
                        return true;
                    default:
                        break;
                }
                return false;
            }
        });
 @Override
    public void onSoftKeyboardOpened(int keyboardHeight) {
        homeNavView.setVisibility(View.GONE);
    }
    @Override
    public void onSoftKeyboardClosed() {
        homeNavView.setVisibility(View.VISIBLE);
    }
    @Override
    protected void onDestroy() {
        mViewPager.setAdapter(null);
        homeNavView.setOnNavigationItemSelectedListener(null);
        super.onDestroy();
    }
//FragmentPagerAdapter 基類
public class BaseFragmentAdapter<F extends Fragment> extends FragmentPagerAdapter {

    /** Fragment集合 */
    private final List<F> mFragmentSet = new ArrayList<>();

    /** 當前顯示的Fragment */
    private F mCurrentFragment;

    /** 當前 ViewPager */
    private ViewPager mViewPager;

    public BaseFragmentAdapter(FragmentActivity activity) {
        this(activity.getSupportFragmentManager());
    }

    public BaseFragmentAdapter(Fragment fragment) {
        this(fragment.getChildFragmentManager());
    }

    public BaseFragmentAdapter(FragmentManager manager) {
        this(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

    public BaseFragmentAdapter(FragmentManager manager, int behavior) {
        super(manager, behavior);
    }

    @NonNull
    @Override
    public F getItem(int position) {
        return mFragmentSet.get(position);
    }

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

    @SuppressWarnings("unchecked")
    @Override
    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        if (getCurrentFragment() != object) {
            // 記錄當前的Fragment對象
            mCurrentFragment = (F) object;
        }
        super.setPrimaryItem(container, position, object);
    }

    public void addFragment(F fragment) {
        mFragmentSet.add(fragment);
    }

    /**
     * 獲取Fragment集合
     */
    public List<F> getAllFragment() {
        return mFragmentSet;
    }

    /**
     * 獲取當前的Fragment
     */
    public F getCurrentFragment() {
        return mCurrentFragment;
    }

    @Override
    public void startUpdate(@NonNull ViewGroup container) {
        super.startUpdate(container);
        if (container instanceof ViewPager) {
            // 記錄綁定 ViewPager
            mViewPager = (ViewPager) container;
        }
    }

    /**
     * 設置當前條目
     *
     * @param clazz             欲切換的 Fragment
     */
    public void setCurrentItem(Class<? extends F> clazz) {
        for (int i = 0; i < mFragmentSet.size(); i++) {
            if (mFragmentSet.get(i).getClass() == clazz) {
                setCurrentItem(i);
                break;
            }
        }
    }

    public void setCurrentItem(int position) {
        if (mViewPager != null) {
            mViewPager.setCurrentItem(position);
        }
    }

    public void setCurrentItem(int position, boolean smoothScroll) {
        if (mViewPager != null) {
            mViewPager.setCurrentItem(position, smoothScroll);
        }
    }
}
//禁用水平滑動的ViewPager(一般用於 APP 主頁的 ViewPager + Fragment)
public final class NoScrollViewPager extends ViewPager {

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

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // 不攔截這個事件
        return false;
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // 不處理這個事件
        return false;
    }

    @Override
    public boolean executeKeyEvent(@NonNull KeyEvent event) {
        // 不響應按鍵事件
        return false;
    }

    @Override
    public void setCurrentItem(int item) {
        boolean smoothScroll;
        int currentItem = getCurrentItem();
        if (currentItem == 0) {
            // 如果當前是第一頁,只有第二頁纔會有動畫
            smoothScroll = item == currentItem + 1;
        } else if (currentItem == getCount() - 1) {
            // 如果當前是最後一頁,只有最後第二頁纔會有動畫
            smoothScroll = item == currentItem - 1;
        } else {
            // 如果當前是中間頁,只有相鄰頁纔會有動畫
            smoothScroll = Math.abs(currentItem - item) == 1;
        }
        super.setCurrentItem(item, smoothScroll);
    }

    public int getCount() {
        PagerAdapter adapter = getAdapter();
        return adapter != null ? adapter.getCount() : 0;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章