1. 程式人生 > 實用技巧 >BottomNavigationView(2)和viewpage組合

BottomNavigationView(2)和viewpage組合

implementation 'com.google.android.material:material:1.2.1'
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width
="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.viewpager.widget.ViewPager android:id="@+id/viewPage" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginTop="0dp" app:layout_constraintHorizontal_bias
="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginBottom="0dp" app:layout_constraintBottom_toTopOf="@+id/navigation" /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id
="@+id/navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/windowBackground" android:layout_alignParentBottom="true" app:layout_constraintBottom_toBottomOf="parent" app:menu="@menu/menu2" /> </androidx.constraintlayout.widget.ConstraintLayout>
public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private BottomNavigationView navigation;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {

        viewPager = (ViewPager) findViewById(R.id.viewPage);

        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
    navigation = (BottomNavigationView)findViewById(R.id.navigation);
    // 重新點選監聽(即點選目前選中的Tab時觸發)
        navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Log.e("ee","Selected Item:"+item.getTitle());
            onTabSelected(item.getItemId());
            return true;
        }
    });
    onTabSelected(R.id.navigation_home);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                // 將當前的頁面對應的底部標籤設為選中狀態

                 navigation.getMenu().getItem(position).setChecked(true);

            }

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


   public void onTabSelected(int id) {
       FragmentManager manager = getSupportFragmentManager();
  FragmentTransaction transaction= manager.beginTransaction();
        Fragment fragment = null;
        switch (id) {
            case R.id.navigation_home:

                viewPager.setCurrentItem(0);
                break;
            case R.id.navigation_dashboard:

                viewPager.setCurrentItem(1);
                break;
            case R.id.navigation_notifications:

                viewPager.setCurrentItem(2);
                break;
            case R.id.navigation_setting:

                viewPager.setCurrentItem(3);

                break;
        }

    }

//    /**
//     * 禁用item 縮放動畫(選中放大圖示/文字 ---->> 圖片靜止不再放大, 文字會有細微的放大效果)
//     * 出處: https://blog.csdn.net/zzyawei/article/details/81082257
//     */
//    @SuppressLint("RestrictedApi")
//    public static void disableItemScale(BottomNavigationView view) {
//        try {
//            BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
//
//            Field mLargeLabelField = BottomNavigationItemView.class.getDeclaredField("mLargeLabel");
//            Field mSmallLabelField = BottomNavigationItemView.class.getDeclaredField("mSmallLabel");
//            Field mShiftAmountField = BottomNavigationItemView.class.getDeclaredField("mShiftAmount");
//            Field mScaleUpFactorField = BottomNavigationItemView.class.getDeclaredField("mScaleUpFactor");
//            Field mScaleDownFactorField = BottomNavigationItemView.class.getDeclaredField("mScaleDownFactor");
//
//            mSmallLabelField.setAccessible(true);
//            mLargeLabelField.setAccessible(true);
//            mShiftAmountField.setAccessible(true);
//            mScaleUpFactorField.setAccessible(true);
//            mScaleDownFactorField.setAccessible(true);
//
//            final float fontScale = view.getResources().getDisplayMetrics().scaledDensity;
//
//            for (int i = 0; i < menuView.getChildCount(); i++) {
//                BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
//
//                TextView lagerObj = (TextView) mLargeLabelField.get(itemView);
//                TextView smallObj = (TextView) mSmallLabelField.get(itemView);
//                lagerObj.setTextSize(smallObj.getTextSize() / fontScale + 0.5f);
//
//                mShiftAmountField.set(itemView, 0);
//                mScaleUpFactorField.set(itemView, 1f);
//                mScaleDownFactorField.set(itemView, 1f);
//
//                itemView.setChecked(itemView.getItemData().isChecked());
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

}
public class ViewPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragmentList = new ArrayList<>();
    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
        fragmentList.add( new BlankFragment1() );
        fragmentList.add( new BlankFragment2() );
        fragmentList.add( new BlankFragment3() );
        fragmentList.add( new BlankFragment4() );
    }
    @Override
    public Fragment getItem(int i) {


        return fragmentList.get( i );
    }

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


}
<menu xmlns:android="http://schemas.android.com/apk/res/android">


    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/bottom1"
        android:title="home" />

    <item
        android:id="@+id/navigation_dashboard"
        android:icon="@drawable/bottom2"
        android:title="dashboard" />

    <item
        android:id="@+id/navigation_notifications"
        android:icon="@drawable/bottom3"
        android:title="notifications" />

    <item
        android:id="@+id/navigation_setting"
        android:icon="@drawable/bottom4"
        android:title="share" />


</menu>