在底部导航视图中不预先选择任何项目

时间:2017-06-12 11:39:45

标签: android bottomnavigationview

我将新的底部导航视图从材质设计库添加到项目中,我希望默认情况下没有预先选择的项目。

现在默认选择第一项。

我用过

mBottomNavigation.getMenu().getItem(0).setChecked(false);

但默认情况下,当在for循环中为所有菜单项执行时,最后一项再次被选中。

我们有办法实现这个目标吗?

8 个答案:

答案 0 :(得分:5)

不确定实现这一目标的正确方法,但解决方法会有所帮助 -

    第一项
  1. setCheckable(false)

    navigation.getMenu().getItem(0).setCheckable(false);

  2. item.setCheckable(true) inside onNavigationItemSelected()

    public boolean onNavigationItemSelected(MenuItem item) {
    
    switch (item.getItemId()) {
        case R.id.navigation_home:
            item.setCheckable(true);
            mTextMessage.setText(R.string.title_home);
            return true;
      }
      return false;
    }
    

答案 1 :(得分:2)

XML代码

<group android:checkableBehavior="single">
    <item              android:id="@+id/nav_item1" />
    <item              android:id="@+id/nav_item2" />
    <item              android:id="@+id/nav_item3" />
    <item              android:id="@+id/nav_item4" />
    <item
        android:id="@+id/nav_item5"
        android:icon="@drawable/icon_item5"
        android:title="Home"
        android:visible="false"/>
</group>

JAVA代码

bottomNavigationView.getMenu().getItem(4).setChecked(true);

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

            switch (menuItem.getItemId()) {
                case R.id.nav_item1:
                    return true;

                case R.id.nav_item2:
                    return true;

                case R.id.nav_item3:
                    return true;

                case R.id.nav_item4:
                    return true;
            }

            // Default operation you want to perform

            return false;
        }
    });

答案 2 :(得分:2)

我想出了另一种解决方案

例如,只需在menu.xml文件中再添加一项

这是我的 bottom_nav_menu.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/ic_home_black_24dp"
        android:title="@string/home" />

    <item
        android:id="@+id/navigation_cart"
        android:icon="@drawable/ic_shopping_cart_black_24dp"
        android:title="@string/cart" />

    <item
        android:id="@+id/navigation_wishlist"
        android:icon="@drawable/ic_favorite_border_black_24dp"
        android:title="@string/wish_list" />

    <item
        android:id="@+id/navigation_account"
        android:icon="@drawable/ic_person_black_24dp"
        android:title="@string/account" />

    
    <!-- Our invisible item -->

    <item
        android:id="@+id/invisible"
        android:visible="false"
        android:icon="@drawable/ic_person_black_24dp"
        android:title="@string/account" />

</menu>

请注意,我已经在最后一个位置添加了该项目,并为其指定了ID invisible,并将可见性设置为false。

现在,在活动中,像这样将所选项目ID设置为此ID

bottomNavMenu.setSelectedItemId(R.id.invisible);

谢谢

答案 3 :(得分:1)

在onCreate方法中添加此行

mBottomNavigation.setSelectedItemId("ID OF YOUR MENU ITEM");

答案 4 :(得分:1)

在行中使用setCheckable而不是setChecked(false)

mBottomNavigation.getMenu().getItem(0).setCheckable(false);

对我有用。

答案 5 :(得分:0)

我创建了一个示例项目,默认情况下没有选中项目。只需确保您的代码中没有navigationView.setCheckedItem(R.id.id)

答案 6 :(得分:0)

如果对Kotlin解决方案感兴趣的人是我的:

//disable the preselected first item
//<navigation> is the bottom navigation view

navigation.menu.getItem(0).isCheckable=false

然后在选择侦听器中,确保向用户显示他选择的内容

BottomNavigationView.OnNavigationItemSelectedListener { item: MenuItem ->
        when (item.itemId) {

            R.id.option1 -> {
                item.isCheckable=true //here is the magic

                //notify the listener
                return@OnNavigationItemSelectedListener true
            }
            R.id.option2 ->{
               item.isCheckable=true

                //notify the listener
                return@OnNavigationItemSelectedListener true
            }
            R.id.option3 ->{
                //go to forgot user fragment
                item.isCheckable=true

                //notify the listener
                return@OnNavigationItemSelectedListener true
            }

            else -> false
        }


    }

最后,选择颜色,以便您可以在color中轻松更改

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true"
      android:color="@color/colorAccent" />
<item android:color="@color/colorPrimary"  />

并将选择器添加到导航视图

 app:itemIconTint="@color/navigation_colors"
 app:itemTextColor="@color/navigation_colors"

现在,如果您需要更改颜色,只需更改选择器即可。

答案 7 :(得分:-1)

我结合@Ashish Kumar提到的解决方案并解决了我的查询和

private void customizeBottomBar() {
        mBottomNavigation.getMenu().getItem(0)
                .setIcon(ContextCompat.getDrawable(activity, R.drawable.ic_reserve_normal));
        changeMenuItemCheckedStateColor(mBottomNavigation, getUnCheckedColor(), getUnCheckedColor());
    }

/**
   * Method to change the color state of bottom bar view
   * @param bottomNavigationView - BottomNavigation view instance
   * @param checkedColorHex int value of checked color code
   * @param uncheckedColorHex int value of unchecked color code
   */
  void changeMenuItemCheckedStateColor(BottomNavigationView bottomNavigationView,
      int checkedColorHex, int 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[]{
        uncheckedColorHex,
        checkedColorHex
    };

    ColorStateList colorStateList = new ColorStateList(states, colors);
    bottomNavigationView.setItemTextColor(colorStateList);
    bottomNavigationView.setItemIconTintList(colorStateList);

  }