如何以编程方式更改底部导航视图的图标?

时间:2019-04-03 13:28:55

标签: android icons bottomnavigationview

我想知道当用户基本选择它时如何更改底部导航视图的图标,然后如果用户选择其他选项,再次用上一个图标替换它。

enter image description here 以下是我的开关盒摘要。

开关(menuItem.getItemId()){

            case R.id.ic_home:

                selectedFragment = new HomeFragment();

                //menuItem.setIcon(R.drawable.like_colored);

                break;

            case R.id.ic_connect:

                selectedFragment = new ConnectionFragment();

                break;

            case R.id.ic_add:

                selectedFragment = new AddPostFragment();

                break;

            case R.id.ic_noti:

                selectedFragment = new NotificationFragment();

                break;

            case R.id.ic_profile:

                selectedFragment = new ProfileFragment();

                break;

4 个答案:

答案 0 :(得分:2)

如果要以编程方式执行此操作,请在switch语句之前将所有菜单项设置为默认图标。

navigation.getMenu().getItem(0).setIcon(R.drawable.defaultIcon1);
navigation.getMenu().getItem(1).setIcon(R.drawable.defaultIcon2);
navigation.getMenu().getItem(2).setIcon(R.drawable.defaultIcon3);
navigation.getMenu().getItem(3).setIcon(R.drawable.defaultIcon4);
navigation.getMenu().getItem(4).setIcon(R.drawable.defaultIcon5);
switch (menuItem.getItemId()) {
      case R.id.ic_home:
                selectedFragment = new HomeFragment();
                menuItem.setIcon(R.drawable.icon1);
                break;
      case R.id.ic_connect:
                selectedFragment = new ConnectionFragment();
                menuItem.setIcon(R.drawable.icon2);
                break;
      case R.id.ic_add:
                selectedFragment = new AddPostFragment();
                menuItem.setIcon(R.drawable.icon3);
                break;
      case R.id.ic_noti:
                selectedFragment = new NotificationFragment();
                menuItem.setIcon(R.drawable.icon4);
                break;
      case R.id.ic_profile:
                selectedFragment = new ProfileFragment();
                menuItem.setIcon(R.drawable.icon5);
                break;
}

或 您可以通过编辑XML文件来实现此目的,而无需通过编程来完成。

drawable / homeIconSelector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/homeNormalIcon" android:state_checked="false"/>
    <item android:drawable="@drawable/homeSelectedIcon" android:state_checked="true"/>
</selector>

和您的菜单文件 菜单/(此处为菜单名).xml

<item
android:id="@+id/navigation_home"
android:icon="@drawable/homeIconSelector"
android:title="@string/title_child" />

答案 1 :(得分:0)

这将从任何地方(例如onResume)更改单个菜单项的图标和文本颜色。下面的代码在4.4.2上(至少通过Pie)可以正常工作。这是这里和其他类似线程的点点滴滴。一些注意事项:

  1. 菜单项的图标是一个称为“ icon”的可绘制图标,但是像我更改文本颜色一样简单地更改它并不合适,有时会出现xml中的图标(如果有的话)。这似乎总是可行。
  2. 它被编写为静态函数,因此可以从多个片段中调用它;您可以轻松地使其成为成员,并去除活动类中的活动参数。
  3. drawable取决于是旧API绘制的矢量还是位图:位图(和新API)代码是注释;较新的API不需要特定的矢量可绘制函数。
    static public void setMenuItemProperties(AppCompatActivity activity,
                                             MenuItem item,
                                             int resIconDrawable, int resColor) {
        int id = item.getItemId();

        BottomNavigationItemView m = activity.findViewById(id);
        TextView t1 = m.findViewById(R.id.smallLabel);
        TextView t2 = m.findViewById(R.id.largeLabel);
        t1.setTextColor(activity.getResources().getColor(resColor));
        t2.setTextColor(activity.getResources().getColor(resColor));

        Drawable d = VectorDrawableCompat.create(activity.getResources(), resIconDrawable, null);
        //Drawable d = activity.getResources().getDrawable(resIconDrawable);
        item.setIcon(d);
    }

像这样从活动中调用,以在菜单项3的两个图标和文本颜色之间进行选择。(navigation是BottomNavigationView。)

      setMenuItemProperties(this, navigation.getMenu().getItem(3),
          enabled ? R.drawable.ic_settings_red_24dp : R.drawable.ic_settings_redish_24dp,
          enabled ? android.R.color.white : R.color.medium_dark_grey);

答案 2 :(得分:0)

让我们尝试这种方法。 在您的可绘制文件夹中创建一个xml文件。例如,可绘制文件夹中的xml文件名为home_selector.xml。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/child" android:state_checked="false"/>
    <item android:drawable="@drawable/child_fill" android:state_checked="true"/>
</selector>

现在在bottom_navigation_main.xml的菜单项中添加home_selector 像:android:icon =“ @ drawable / child_selector” 示例:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:id="@+id/navigation_child"
    android:icon="@drawable/child_selector"
    android:title="@string/title_child" />

</menu>

完成,尝试一下。 谢谢

答案 3 :(得分:0)

如果要更改菜单栏图标,请尝试以下代码

BottomNavigationView navigation = FindViewById<BottomNavigationView>Resource.Id.navigation); IMenu i=navigation.Menu;IMenuItem ii= i.FindItem(Resource.Id.navigation_home); ii.SetIcon(Resource.Drawable.not_connected);