Android:底部导航视图-更改所选项目的图标

Android:底部导航视图-更改所选项目的图标,android,android-layout,android-support-library,bottomnavigationview,Android,Android Layout,Android Support Library,Bottomnavigationview,我在我的应用程序中添加了BottomNavigationView main.xml <android.support.design.widget.BottomNavigationView android:id="@+id/bottom_navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layo

我在我的应用程序中添加了
BottomNavigationView

main.xml

<android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@color/white"
        app:itemTextColor="@color/white"
        app:menu="@menu/bottom_navigation_main" />
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_favorites"
        android:enabled="true"
        android:icon="@drawable/ic_favorite_white_24dp"
        android:title="@string/text_favorites"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_schedules"
        android:enabled="true"
        android:icon="@drawable/ic_access_time_white_24dp"
        android:title="@string/text_schedules"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_music"
        android:enabled="true"
        android:icon="@drawable/ic_audiotrack_white_24dp"
        android:title="@string/text_music"
        app:showAsAction="ifRoom" />
</menu>
我想更改所选位置底部导航的图标。当用户单击一个项目时,我们如何实现此功能


(如果用户单击了一个项目,则图标将更改为另一个项目)

找到了答案。我们可以使用

item.setIcon(R.drawable.icon_name) 
要更改图标。。我会尽力回答你的问题

 bottomNavigationView.setOnNavigationItemSelectedListener(
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.action_favorites:
                            //change the icon
                         item.setIcon(R.drawable.icon_name);
                        case R.id.action_schedules:

                        case R.id.action_music:

                    }
                    return true;
                }
            });

您需要在单击时重置图标,然后在开关盒上只需设置您需要更改的图标,因此仅当选中时图标才会更改

Menu menu = bottomNavigationView.getMenu();
menu.findItem(R.id.action_favorites).setIcon(favDrawable);

switch (item.getItemId()) {
                case R.id.action_favorites:
                     item.setIcon(favDrawableSelected);
                case R.id.action_schedules:
                case R.id.action_music:
            }

您只需在drawable文件夹中创建drawable选择器,即可根据视图中使用的小部件的状态更改图像

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

如果上述解决方案不适用于您更改所选项目图标,请在代码中添加以下行:

bottomNavigationView.setItemIconTintList(null);
这将禁用选定项目图标的着色效果


我也有同样的问题。我添加了选择器drawable,用于在选中/选中BottomNavigationView项目时更改其图标。

我发现这是使用选择器drawable的更好方法:

首先在drawable文件夹中创建一个xml文件。 例如,在drawable文件夹中,xml文件名为child_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>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/menu_selected" android:state_checked="true"/>
    <item android:drawable="@drawable/menu" android:state_checked="false"/>
</selector>
并且必须在活动中添加以下行-

bottomNavigationView.setItemIconTintList(null);

祝你好运。

好的,我想了解如何让每个项目都有自己的图像,并且在评论中对它应该放在哪里有些困惑,我想输入这个答案

首先创建菜单及其项。您的选择器将进入图标值中的这些项目。这里我们有两个选择器,每个选择器都是为其菜单项设计的

item
    android:id="@+id/navigation_home"
    android:icon="@drawable/navigation_home_selector"
    android:title="@string/title_home" />
item
    android:id="@+id/navigation_profile"
    android:icon="@drawable/navigation_profile_selector"
    android:title="@string/title_profile" />
现在,这是您的选择器文件,将存放在您的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>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/menu_selected" android:state_checked="true"/>
    <item android:drawable="@drawable/menu" android:state_checked="false"/>
</selector>

给你。所有这些都很有魅力。

感谢为我设计的
选择器
方法(
APIV26

<> >对于那些想知道如何将其设置为原点<强>未选中图标编程的人,考虑在Kotlin > >(java)或<代码>((或) >:< /P>之前,将此添加到NavigalItEndoStistTistListAudio<代码> >
在最新的材质设计库中,在不需要提供属性
itemIconTint
的地方提供了默认的底部导航行为,它将自动对其进行管理

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottomNavigationView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="0dp"
    android:layout_marginEnd="0dp"
    android:layout_alignParentBottom="true"
    android:background="?android:attr/windowBackground"
    app:itemBackground="@color/white"
    app:itemTextColor="@color/textBlue"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_navigation"
    app:labelVisibilityMode="labeled"
    app:itemTextAppearanceActive="@color/colorPrimary"
    />

阿杰·辛格(ajay singh)的上述回答帮了我的忙,也利用了上面的答案

res->drawable文件夹(选择器\u stock\u bottom\u nav\u view.xml)中的以下代码

额外功能:更改活动/非活动状态文本的大小 将以下代码放在styles.xml文件中

    <style name="stockBottomNavigationView.InActive" parent="@style/TextAppearance.AppCompat.Caption">
        <item name="android:textSize">7sp</item>
    </style>

    <style name="stockBottomNavigationView.Active" parent="@style/TextAppearance.AppCompat.Caption">
        <item name="android:textSize">8sp</item>
    </style>

7便士
8sp

以上答案是stackoverflow中与底部导航视图、图标和文本颜色/大小更改相关的各种答案的汇编。

您可以使用此方法动态设置图标

R.id.navigation\u菜单
是您的
R.menu.menu\u底部导航
中的项目id

val menuItem = bottomNavigationView.menu.findItem(R.id.navigation_menu)
menuItem.setIcon(R.drawable.ic_icon)


这比编程方法更有效。要指定的状态实际上是选中的android:state
未选中的android:state
在何处应用此功能?它在kitkat android版本中不起作用。应用程序崩溃。@ASN从底部导航xml代码中删除色调,以恢复应用程序的原始颜色icons@AbhinavUpadhyay从xml中删除ItemIContent仍然不起作用。bottomNavigationView.SetItemIContentList(null)是解决方案。您知道xml中的等价物吗?我认为显式添加声明“item”的代码段也会很有帮助。MenuItem=menu.findItem(R.id.action\u收藏夹);我会尝试这段代码,这是可行的,但当我单击其他图标时,它不会设置默认图标,如填充图标或不填充图标。这是可行的,但如何在单击其他项目时将图标重置回原始图标在我的情况下,我只是尝试为不同的按钮更改不同的色调颜色,得到了这个,bottomNavigationView.ItemIContitList=ColorStateList.valueOf(ContextCompat.getColor(this,iconColor))这可以工作,但可能是一项额外的工作。检查下面的答案以获得更干净的解决方案。工作正常Thnx。谢谢你的答案帮助我显示原始图标而不是彩色矩形。这是解决上述所有问题的答案,当你设置背景选择器时,如果没有它,它将无法工作,thanksIt工作正常。别忘了用drawables创建选择器,并在菜单文件中使用它。虽然如此,我还是很想找到xml布局属性的等价物。“@null”对我不起作用。这是可行的,但如何在单击另一项时将图标重置回原来的图标。@Eswar请查看我在上面的答案。使用选择器,它可以完全使用2个不同的图像或颜色更改的图像(我的应用程序正在执行的操作)如何更改图标文本颜色??我相信您可以在navigationListener上进行设置
BottomNavigationView.SetTextColor
我在这个答案(以及其他几个答案)中缺少的关键信息是选择器xml必须放在名为navigation\u home\u selector.xml的可绘图文件夹中的一个文件中;这个名称使得从android:icon=@drawable/navigation\u home\u选择器到智能drawable对象的链接起作用。@JohnT这是由图标部分中的实际值暗示的。它告诉您该文件在内部可使用该名称绘制。正如其他5个人已经建议了相同的解决方案一样,Java/Kotlin中仍然缺少一行代码,这是实现此功能所必需的。不幸的是.BottomNavigationView.SetItemIContentList(null);用一个图标和色调而不是两个图标(每个选中状态一个)能达到同样的效果吗?太好了,a+1对我来说。这进一步补充了最初提出的问题,并使用了更多flare。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/button_and_tab_color" android:state_checked="true" />
    <item android:color="@android:color/darker_gray" android:state_checked="false" />
</selector>

<com.google.android.material.bottomnavigation.BottomNavigationView

        app:itemIconTint="@drawable/selector_stock_bottom_nav_view" //To change icon color
        app:itemTextColor="@drawable/selector_stock_bottom_nav_view" //To change text color
        app:itemTextAppearanceActive="@style/stockBottomNavigationView.Active" //To change size of text during active state
        app:itemTextAppearanceInactive="@style/stockBottomNavigationView.InActive"
        app:menu="@menu/bottom_navigation_menu"
        app:labelVisibilityMode="labeled"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_gravity="bottom"
        app:selectedBackgroundVisible="false"
        android:id="@+id/stock_bottom_navigation"/>

private BottomNavigationView.OnNavigationItemSelectedListener stockBottomNavListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {

            return true;

        }
    };
    <style name="stockBottomNavigationView.InActive" parent="@style/TextAppearance.AppCompat.Caption">
        <item name="android:textSize">7sp</item>
    </style>

    <style name="stockBottomNavigationView.Active" parent="@style/TextAppearance.AppCompat.Caption">
        <item name="android:textSize">8sp</item>
    </style>
val menuItem = bottomNavigationView.menu.findItem(R.id.navigation_menu)
menuItem.setIcon(R.drawable.ic_icon)