如何通过编程更改底部导航栏视图的图标?

7
我希望知道如何在用户基本选择底部导航视图时更改图标,如果用户选择不同选项,则再次将其替换为先前的图标。

enter image description here 以下是我的 switch case 代码片段。

switch (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;
5个回答

16

如果您想以编程的方式完成此操作,请在转换语句之前将所有菜单项设置为默认图标。

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>

以及您的菜单文件 menu/(menunamehere).xml

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

当使用底部导航视图的菜单项时,这个很有用。 - Mohammad Arman

2
这将更改单个菜单项的图标和文本颜色,可从任何地方(例如 onResume)进行操作。以下代码在4.4.2到(至少)Pie上运行良好。它是从这里和其他类似的线程中提取的一些片段。一些注意事项:
  1. 菜单项的图标是一个名为"icon"的可绘制对象,但像我改变文本颜色那样仅仅改变它并不起作用 - 有时xml中的图标(如果有)会显示出来。这种方法似乎总是有效的。
  2. 它被编写成静态函数,因此可以从多个片段中调用;您可以轻松将其转换成成员对象,并在活动类中删除活动参数。
  3. 可绘制对象取决于它是否为旧API的矢量或位图可绘制对象:位图(和新API)代码是一条注释;新API不需要特定的矢量可绘制对象函数。
最初的回答:这段代码可以在任何地方(如onResume)更改单个菜单项的图标和文本颜色。要注意三点:1.菜单项的图标是一个名为“icon”的可绘制对象,不应该简单地改变它,否则xml中的图标可能会出现。2.代码是静态函数,因此可以从多个片段中调用。3.可绘制对象取决于它是否为旧版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

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

<?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>

完成了,请试一试。 谢谢


0

-2
如果您想更改菜单栏图标,请尝试以下代码:
BottomNavigationView navigation = FindViewById(Resource.Id.navigation); IMenu i = navigation.Menu; IMenuItem ii = i.FindItem(Resource.Id.navigation_home); ii.SetIcon(Resource.Drawable.not_connected);

你的代码缺少一些格式。 - JCutting8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接