BottomNavigationView - How to uncheck all MenuItems and keep Titles being displayed?

后端 未结 10 1239
面向向阳花
面向向阳花 2020-12-18 19:33

As I liked the design from BottomNavigationView I decided to implement a new Menu for my App with it, instead of just using simple buttons.

I took this

相关标签:
10条回答
  • 2020-12-18 19:52

    Try this, it worked for me

     <item
        android:id="@+id/uncheckedItem"
        android:visible="false"
        android:title="" />
    

    and set

    bottomNavigationView.getMenu().findItem(R.id.uncheckedItem).setChecked(true);
    

    you get all menu item view as unselected; since the selection is given for uncheckedItem which is invisible

    Hope it helped you.

    0 讨论(0)
  • 2020-12-18 19:52

    The best answer mNavigationBottom.getMenu().setGroupCheckable(0, false, true) did not work for me. It still showed the first item as being selected.

    What did work for me is to have an invisible item and to select that, exactly like you did in the question.

    Add app:labelVisibilityMode="labeled" to your BottomNavigationView so that all items remain in view with their titles.

    0 讨论(0)
  • 2020-12-18 19:53

    Your solution seems change the space between items

    There is my solution :

    "Just set color of clicked same as color of un-clicked."

    for example:

    private void changeMenuItemCheckedStateColor(BottomNavigationView bottomNavigationView, String checkedColorHex, String uncheckedColorHex) {
        int checkedColor = Color.parseColor(checkedColorHex);
        int uncheckedColor = Color.parseColor(uncheckedColorHex);
    
        int[][] states = new int[][] {
                new int[] {-android.R.attr.state_checked}, // unchecked
                new int[] {android.R.attr.state_checked}, // checked
    
        };
    
        int[] colors = new int[] {
                uncheckedColor,
                checkedColor
        };
    
        ColorStateList colorStateList = new ColorStateList(states, colors);
    
        bottomNavigationView.setItemTextColor(colorStateList);
        bottomNavigationView.setItemIconTintList(colorStateList);
    
    }
    

    if you want to un-check all items, you can

    changeMenuItemCheckedStateColor(mBottomNavigationView, "#999999", "#999999");
    

    if you want to restore the color setting, you can

    changeMenuItemCheckedStateColor(mBottomNavigationView, "FF743A", "999999");
    
    0 讨论(0)
  • 2020-12-18 20:01
        if(isDarkMode(context)) {
            mBotNavView.setItemIconTintList(ColorStateList.valueOf(Color.parseColor("#FFFFFF")));
        } else {
            mBotNavView.setItemIconTintList(ColorStateList.valueOf(Color.parseColor("#000000")));
        }
    
        public boolean isDarkMode(Context context) {
            int nightModeFlags = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
            return darkMode = (nightModeFlags == Configuration.UI_MODE_NIGHT_YES);
        }
    
    0 讨论(0)
  • 2020-12-18 20:05

    To unselect all items I have create this extension:

    fun BottomNavigationView.uncheckAllItems() {
        menu.setGroupCheckable(0, true, false)
        for (i in 0 until menu.size()) {
            menu.getItem(i).isChecked = false
        }
        menu.setGroupCheckable(0, true, true)
    }
    

    menu.setGroupCheckable(0, true, false) make it possible. The third parameter made the menu not exclusive and then within the loop you change the checked status. To finish set the menu to exclusive again.

    Here the doc

    0 讨论(0)
  • 2020-12-18 20:08

    This is the same as the accepted answer except I have changed two lines of code marked below. When looping through the BottomNavigationItemViews, I set checked to false always and I also set checkable to false. This prevents the Menu Items from changing size. You still need this proguard rule:

          -keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
             boolean mShiftingMode;
          }
    

    Updated code:

        static void removeShiftMode(BottomNavigationView view)
        {
            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);
                    item.setShiftingMode(false);
                    item.setChecked(false); // <--- This line changed
                    item.setCheckable(false);  // <-- This line was added
                }
            }
            catch (NoSuchFieldException e)
            {
                Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");
            }
            catch (IllegalAccessException e)
            {
                Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");
            }
    
       }
    
    0 讨论(0)
提交回复
热议问题