How to disable BottomNavigationView shift mode?

后端 未结 21 1951
Happy的楠姐
Happy的楠姐 2020-11-22 15:55

BottomNavigationView doesn\'t show menu\'s title that are inactive.

How to show titles of all menu elements in bottomNavigationBar? The problem is that in my case s

相关标签:
21条回答
  • 2020-11-22 16:40

    As others have pointed out, since support library 28.0.0-alpha1 it is possible:

    <android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />
    

    or you can set it programatically.

    Note: if you are upgrading from an older version of support library, do not forget to raise compile SDK version. Check versions of support libraray here: Support Library versions

    However, you may still get labelVisibilityMode not found message when compile, if your app depends on older versions of the design support library. If this is the case, try to upgrade to a version of the given dependency, that depends on at least the version of 28.0.0-alpha1 of design support library. If that's not possible, define the dependency explicitly.

    If you use Gradle

    1. You can check your depdendecies by running dependencies task and search for the version number of com.android.support:design.
    2. To add design support dependency explicitly in your build.gradle:

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

    0 讨论(0)
  • 2020-11-22 16:42

    You can now use app:labelVisibilityMode="[labeled, unlabeled, selected, auto]" in 28-alpha

    • labeled will keep all labels visible.
    • unlabeled will show only icons.
    • selected will only show the label for the selected item and shift items.
    • auto will choose labeled or selected based on the number of items you have. labeled for 1-3 items and selected for 3+ items.
    0 讨论(0)
  • 2020-11-22 16:43

    I had some weird behavior with BottomNavigationView. When I was selecting any item/fragment in it, the fragment pushes BottomNavigationView a bit lower, so text of BottomNavigationView goes below the screen, so only icons were visible and text goes hidden on clicking of any item.

    If you are facing that weird behavior then Here is the solution. Just remove

    android:fitsSystemWindows="true"
    

    in your root layout of fragment. Just remove this and boom! BottomNavigationView will work fine, now it can be shown with text and icon. I had this in my root CoordinatorLayout of fragment.

    Also don't forget to add

    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
    

    in your activity to disable shifting mode. Though it is not exactly related to the asked question, but still I find this helpful.

    0 讨论(0)
  • 2020-11-22 16:45

    For updated answer using the default. Update to latest design library

    implementation "com.android.support:design:28.0.0"

    and put to your BottomNavigationView xml attributes

    app:itemHorizontalTranslationEnabled="false"
    

    you can put it also as programmatically

    bottomNavigationView.setItemHorizontalTranslationEnabled(false);
    

    You can find source here BottomNavigationView

    Hope this helps you.

    0 讨论(0)
  • 2020-11-22 16:46

    Przemysław's answer in Kotlin as an extension function

    @SuppressLint("RestrictedApi")
    fun BottomNavigationView.disableShiftMode() {
        val menuView = getChildAt(0) as BottomNavigationMenuView
        try {
            val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
            shiftingMode.isAccessible = true
            shiftingMode.setBoolean(menuView, false)
            shiftingMode.isAccessible = false
            for (i in 0 until menuView.childCount) {
                val item = menuView.getChildAt(i) as BottomNavigationItemView
                item.setShiftingMode(false)
                // set once again checked value, so view will be updated
                item.setChecked(item.itemData.isChecked)
            }
        } catch (e: NoSuchFieldException) {
            Log.e(TAG, "Unable to get shift mode field", e)
        } catch (e: IllegalStateException) {
            Log.e(TAG, "Unable to change value of shift mode", e)
        }
    }
    

    Usage (with Kotlin Android Extensions):

    bottom_navigation_view.disableShiftMode()
    
    0 讨论(0)
  • 2020-11-22 16:46

    I use Android Studio 4.0.1 to develop it. The following is my result...

    About BottomNavigationViewHelper.java My code is work here

    import com.google.android.material.bottomnavigation.BottomNavigationItemView;
    import com.google.android.material.bottomnavigation.BottomNavigationMenuView;
    import com.google.android.material.bottomnavigation.BottomNavigationView;
    import com.google.android.material.bottomnavigation.LabelVisibilityMode;
    import android.annotation.SuppressLint;
    import android.util.Log;
    import java.lang.reflect.Field;
    public class BottomNavigationViewHelper {
        @SuppressLint("RestrictedApi")
        public static void disableShiftMode(BottomNavigationView view) {
            view.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
            BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.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 item = (BottomNavigationItemView) menuView.getChildAt(i);
                    //noinspection RestrictedApi
                    item.setShifting(false);
                    item.setLabelVisibilityMode( LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
                    // set once again checked value, so view will be updated
                    //noinspection RestrictedApi
                    item.setChecked(item.getItemData().isChecked());
                }
            } catch (NoSuchFieldException e) {
                Log.e("BNVHelper", "Unable to get shift mode field", e);
            } catch (IllegalAccessException e) {
                Log.e("BNVHelper", "Unable to change value of shift mode", e);
            }
        }
    }
    

    Then we can start to use BottomNavigationViewHelper class And this is my code for MainActivity.java.

    BottomNavigationView navView = findViewById(R.id.nav_view); BottomNavigationViewHelper.disableShiftMode(navView);

    import android.os.Bundle;
    import com.google.android.material.bottomnavigation.BottomNavigationView;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.navigation.NavController;
    import androidx.navigation.Navigation;
    import androidx.navigation.ui.AppBarConfiguration;
    import androidx.navigation.ui.NavigationUI;
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            BottomNavigationView navView = findViewById(R.id.nav_view);
            BottomNavigationViewHelper.disableShiftMode(navView);
            // Passing each menu ID as a set of Ids because each
            // menu should be considered as top level destinations.
            AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                    R.id.navigation_settings,
                    R.id.navigation_connection,
                    R.id.navigation_status,
                    R.id.navigation_report,
                    R.id.navigation_profile
            ).build();
    
            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
            NavigationUI.setupWithNavController(navView, navController);
            getSupportActionBar().hide();
        }
    }
    
    0 讨论(0)
提交回复
热议问题