BottomNavigationView的使用


BottomNavigationView的使用

 

廢話少說, 先看東西

  

 

依賴

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

 

布局 

//用這個控件需要添加 design包: implementation 'com.android.support:design:26.1.0'
//版本號和compileSdkVersion的版本號相關
    
<android.support.design.widget.BottomNavigationView
    android:id="@+id/bnvBottomBar"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#bb88f7ff"
    app:menu="@menu/bottom_bar" />

 

menu: bottom_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/home"
        android:title="home" />

    <item
        android:id="@+id/navigation_msg"
        android:icon="@drawable/msg"
        android:title="msg" />

    <item
        android:id="@+id/navigation_info"
        android:icon="@drawable/info"
        android:title="info" />

    <item
        android:id="@+id/navigation_set"
        android:icon="@drawable/set"
        android:title="set" />

    <item
        android:id="@+id/navigation_me"
        android:icon="@drawable/me"
        android:title="me" />
</menu>

 

java代碼

//聲明
private BottomNavigationView bnvBottomBar;

//查找控件
bnvBottomBar = (BottomNavigationView) findViewById(R.id.bnvBottomBar);

disableShiftingMode(bnvBottomBar);  //禁止偏移   -------->> 方法在后面
//disableItemScale(bnvBottomBar);   //禁止放大   -------->> 方法在后面

//監聽事件
bnvBottomBar.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_home:
                Toast.makeText(MainActivity.this, "home", Toast.LENGTH_SHORT).show();
                break;
            case R.id.navigation_info:
                Toast.makeText(MainActivity.this, "info", Toast.LENGTH_SHORT).show();
                break;
            case R.id.navigation_msg:
                Toast.makeText(MainActivity.this, "msg", Toast.LENGTH_SHORT).show();
                break;
            case R.id.navigation_set:
                Toast.makeText(MainActivity.this, "set", Toast.LENGTH_SHORT).show();
                break;
            case R.id.navigation_me:
                Toast.makeText(MainActivity.this, "me", Toast.LENGTH_SHORT).show();
                break;
        }
        return true; //返回true, 返回false點擊item沒有任何效果
    }
});


//點擊切換item
bnvBottomBar.setSelectedItemId(R.id.navigation_home);

 

禁用item個數大於3時的平移及縮放效果

/**
 * 禁用item>=3時的平移及縮放(沒有平移效果了, 但是圖標和文字還有放大效果)
 * 出處: https://blog.csdn.net/zzyawei/article/details/81082257
 */
@SuppressLint("RestrictedApi")
public static void disableShiftingMode(BottomNavigationView view) {
    try {
        BottomNavigationMenuView mMenuView = (BottomNavigationMenuView) view.getChildAt(0);
        Field mShiftingModeField = BottomNavigationMenuView.class.getDeclaredField("mShiftingMode");
        mShiftingModeField.setAccessible(true);
        mShiftingModeField.set(mMenuView, false);
        for (int i = 0; i < mMenuView.getChildCount(); i++) {
            BottomNavigationItemView itemView = (BottomNavigationItemView) mMenuView.getChildAt(i);
            itemView.setShiftingMode(false);
            itemView.setChecked(itemView.getItemData().isChecked());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

禁用item 縮放動畫 - 該方法效果不太明顯

/**
 * 禁用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();
    }
}

 

------------------------------------------->>    <<-------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM