Android:底部导航视图 - 更改所选项目的图标
Android: Bottom Navigation View - change icon of selected item
我已经在我的应用程序中添加了 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" />
bottom_navigation_main.xml
<?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>
MainActivity 点击
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_favorites:
//need change icon of favotites here.
case R.id.action_schedules:
case R.id.action_music:
}
return true;
}
});
我想更改所选位置底部导航的图标。当用户单击一个项目时,我们如何实现此功能?
(如果用户点击一个项目然后图标变为另一个)
找到答案了。我们可以使用
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;
}
});
你需要重置图标的onclick,然后在switch case上你只需要设置你需要改变的那个,所以只有在选中时图标才会改变。
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:
}
您可以简单地在可绘制文件夹中创建可绘制选择器,图像可以根据视图中使用的小部件的状态进行更改
<?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);
这将禁用所选项目图标的色调效果。
我遇到了同样的问题。我添加了可绘制的选择器,用于在 checked/selected.
时更改 BottomNavigationView 项目的图标
我发现这是使用可绘制选择器的更好方法:
首先在您的可绘制文件夹中创建一个 xml 文件。
例如,xml 文件名是 child_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 的菜单项中添加 child_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>
并且必须在 activity-
中添加以下行
bottomNavigationView.setItemIconTintList(null);
祝你好运。
好的,我想了解如何让每个项目都有自己的图像,并且在关于它应该放在哪里的评论中有些混乱,我想输入这个答案。
首先创建您的菜单及其项目。您的选择器将进入 ICON 值中的那些项目。这里我们有 2 个选择器,每个选择器都针对其菜单项。
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" />
现在这是您的选择器文件,它将存放在您的可绘制文件夹中。
<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>
最后一步由 @ 提供
KishanSolanki124
将这行代码添加到您的 BottomNavigationView。
BottomNavigationView.setItemIconTintList(null);
给你。一切都像一个魅力。
感谢 selector
方法,对我有用 (api v26
)
对于那些想知道如何以编程方式将其设置回原点 未选择的图标 的人,请考虑将其添加到您的 OnNavigationItemSelectedListener
之前 switch(Java)
或 when(Kotlin)
:
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
navigation.menu.getItem(0).setIcon(R.drawable.ic_tab_home)
navigation.menu.getItem(1).setIcon(R.drawable.ic_tab_account)
navigation.menu.getItem(2).setIcon(R.drawable.ic_tab_trading)
navigation.menu.getItem(3).setIcon(R.drawable.ic_tab_wallet)
when (item.itemId) {
R.id.navigation_home -> {
message.setText(R.string.title_home)
item.setIcon(R.drawable.ic_tab_home_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_account -> {
message.setText(R.string.title_account)
item.setIcon(R.drawable.ic_tab_account_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_trading -> {
message.setText(R.string.title_trading)
item.setIcon(R.drawable.ic_tab_trading_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_wallet-> {
message.setText(R.string.title_wallet)
item.setIcon(R.drawable.ic_tab_wallet_active)
return@OnNavigationItemSelectedListener true
}
}
false
}
在最新的 material 设计库中提供了 BottomNavigation 的默认行为,您无需提供 属性 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 文件夹中的以下代码 (selector_stock_bottom_nav_view.xml)
<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"/>
我没有在代码中的任何地方使用 "BottomNavigationView.setItemIconTintList(null)"。
现在最重要的一段代码来了,确保return"TRUE"在底部导航视图的侦听器,即
private BottomNavigationView.OnNavigationItemSelectedListener stockBottomNavListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
return true;
}
};
奖励:更改文本大小 active/inactive 状态
将以下代码放入 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>
以上答案是 Whosebug 中与底部导航视图、图标和文本 color/size 变化相关的各种答案的答案汇编。
您可以使用此方法动态设置您的图标。
R.id.navigation_menu
是您在 R.menu.menu_bottom_navigation
中的项目 ID。
val menuItem = bottomNavigationView.menu.findItem(R.id.navigation_menu)
menuItem.setIcon(R.drawable.ic_icon)
我已经在我的应用程序中添加了 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" />
bottom_navigation_main.xml
<?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>
MainActivity 点击
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_favorites:
//need change icon of favotites here.
case R.id.action_schedules:
case R.id.action_music:
}
return true;
}
});
我想更改所选位置底部导航的图标。当用户单击一个项目时,我们如何实现此功能?
(如果用户点击一个项目然后图标变为另一个)
找到答案了。我们可以使用
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;
}
});
你需要重置图标的onclick,然后在switch case上你只需要设置你需要改变的那个,所以只有在选中时图标才会改变。
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:
}
您可以简单地在可绘制文件夹中创建可绘制选择器,图像可以根据视图中使用的小部件的状态进行更改
<?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);
这将禁用所选项目图标的色调效果。
我遇到了同样的问题。我添加了可绘制的选择器,用于在 checked/selected.
时更改 BottomNavigationView 项目的图标我发现这是使用可绘制选择器的更好方法:
首先在您的可绘制文件夹中创建一个 xml 文件。 例如,xml 文件名是 child_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 的菜单项中添加 child_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>
并且必须在 activity-
中添加以下行bottomNavigationView.setItemIconTintList(null);
祝你好运。
好的,我想了解如何让每个项目都有自己的图像,并且在关于它应该放在哪里的评论中有些混乱,我想输入这个答案。
首先创建您的菜单及其项目。您的选择器将进入 ICON 值中的那些项目。这里我们有 2 个选择器,每个选择器都针对其菜单项。
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" />
现在这是您的选择器文件,它将存放在您的可绘制文件夹中。
<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>
最后一步由 @ 提供 KishanSolanki124
将这行代码添加到您的 BottomNavigationView。
BottomNavigationView.setItemIconTintList(null);
给你。一切都像一个魅力。
感谢 selector
方法,对我有用 (api v26
)
对于那些想知道如何以编程方式将其设置回原点 未选择的图标 的人,请考虑将其添加到您的 OnNavigationItemSelectedListener
之前 switch(Java)
或 when(Kotlin)
:
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
navigation.menu.getItem(0).setIcon(R.drawable.ic_tab_home)
navigation.menu.getItem(1).setIcon(R.drawable.ic_tab_account)
navigation.menu.getItem(2).setIcon(R.drawable.ic_tab_trading)
navigation.menu.getItem(3).setIcon(R.drawable.ic_tab_wallet)
when (item.itemId) {
R.id.navigation_home -> {
message.setText(R.string.title_home)
item.setIcon(R.drawable.ic_tab_home_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_account -> {
message.setText(R.string.title_account)
item.setIcon(R.drawable.ic_tab_account_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_trading -> {
message.setText(R.string.title_trading)
item.setIcon(R.drawable.ic_tab_trading_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_wallet-> {
message.setText(R.string.title_wallet)
item.setIcon(R.drawable.ic_tab_wallet_active)
return@OnNavigationItemSelectedListener true
}
}
false
}
在最新的 material 设计库中提供了 BottomNavigation 的默认行为,您无需提供 属性 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 文件夹中的以下代码 (selector_stock_bottom_nav_view.xml)
<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"/>
我没有在代码中的任何地方使用 "BottomNavigationView.setItemIconTintList(null)"。
现在最重要的一段代码来了,确保return"TRUE"在底部导航视图的侦听器,即
private BottomNavigationView.OnNavigationItemSelectedListener stockBottomNavListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
return true;
}
};
奖励:更改文本大小 active/inactive 状态 将以下代码放入 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>
以上答案是 Whosebug 中与底部导航视图、图标和文本 color/size 变化相关的各种答案的答案汇编。
您可以使用此方法动态设置您的图标。
R.id.navigation_menu
是您在 R.menu.menu_bottom_navigation
中的项目 ID。
val menuItem = bottomNavigationView.menu.findItem(R.id.navigation_menu)
menuItem.setIcon(R.drawable.ic_icon)