我正在尝试使底部导航有些棘手。
确实,我想要这种底部导航:
每个选项卡在选择时都有不同的颜色。例如,小节在选中时(图标和标题)将显示为红色,而小节在选中时将显示为绿色...
所以我试图对每个项目使用一个选择器(在我的菜单中)
但是没有应用颜色。图标更改成功(选择一个项目时,我尝试放置一个完全不同的图标),但选项卡标题的颜色未更改。
我试图从底部导航中删除2个属性:
app:itemTextColor="@color/black"
app:itemIconTint="@color/black"
但是,由于选择了选项卡时,主题应用程序的颜色(主色)已应用,因此情况变得越来越糟。
我的底部导航:
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:menu="@menu/main_bottom_navigation"
style="@style/BottomNavigationView"
app:labelVisibilityMode="labeled"
android:layout_alignParentBottom="true" />
我的选择器之一(逻辑应用于所有项目)
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Pressed state -->
<item android:drawable="@drawable/bottom_bar_journal_on"
android:color="@color/red_FF623E"
android:state_checked="true"/>
<!-- Default state -->
<item android:drawable="@drawable/bottom_bar_journal_off"
android:color="@color/background_yellow"
android:state_checkable="false"/>
</selector>
还有我的菜单(我在其中应用了所有选择器):
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_journal"
android:enabled="true"
android:icon="@drawable/bottom_bar_journal"
android:title="@string/main_menu_journal"
app:showAsAction="withText" />
<item
android:id="@+id/action_measure"
android:enabled="true"
android:icon="@drawable/bottom_bar_measure_off"
android:title="@string/main_menu_measure"
app:showAsAction="withText" />
<item
android:id="@+id/action_add"
android:enabled="false"
android:title=""
app:showAsAction="withText" />
<item
android:id="@+id/action_treatment"
android:enabled="true"
android:icon="@drawable/bottom_bar_treatment_off"
android:title="@string/main_menu_treatment" />
<item
android:id="@+id/action_profile"
android:enabled="true"
android:icon="@drawable/bottom_bar_profile"
android:title="@string/main_menu_profile"
app:showAsAction="withText" />
</menu>
答案 0 :(得分:2)
底部导航栏通过app:itemIconTint覆盖图标颜色,但是从XML中删除该属性只会使导航栏改为使用应用程序的默认颜色。为了防止栏应用颜色更改并使选择器按预期工作,您必须在代码中将图标色调列表设置为null,如下所示:
bottom_navigation_bar.itemIconTintList = null
编辑: 我看到您也想给文本加上颜色,这有点棘手。我唯一能想到的解决方案是忘记可绘制的选择器,而每次底部导航栏选择更改时,只需替换项目的图标色调列表和文本颜色即可。在您的导航栏托管活动中,定义以下两个:
private val bottomNavBarStateList = arrayOf(
intArrayOf(android.R.attr.state_checked),
intArrayOf(-android.R.attr.state_checked)
)
private fun updateBottomNavBarColor(currentSelectedColor: Int) {
val colorList = intArrayOf(
ContextCompat.getColor(this, currentSelectedColor),
ContextCompat.getColor(this, R.color.text_tertiary)
)
val colorStateList = ColorStateList(bottomNavBarStateList, colorList)
bottom_navigation_bar.itemIconTintList = colorStateList
bottom_navigation_bar.itemTextColor = colorStateList
}
然后在导航栏的ItemSelectedListener中,使用所需颜色调用updateBottomNavBarColor:
bottom_navigation_bar.setOnNavigationItemSelectedListener {
when(it.itemId) {
R.id.bottom_nav_action_treatment -> {
updateBottomNavBarColor(R.color.treatment)
}
R.id.bottom_nav_action_profile -> {
updateBottomNavBarColor(R.color.profile)
}
else -> {
}
}
}
答案 1 :(得分:0)
您将在BottomNavigationView中像这样使用它:
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:itemIconTint="@drawable/bottom_navigation_colors"
app:itemTextColor="@drawable/bottom_navigation_colors"
app:menu="@menu/bottom_navigation_menu" />
app:itemIconTint 和 app:itemTextColor 采用ColorStateList而不是简单的颜色。这意味着您可以为这些颜色编写一个选择器,以响应项目的状态更改。
例如,您可能具有 bottom_navigation_colors.xml ColorStateList,其中包含:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="true"
android:color="@color/colorPrimary" />
<item
android:state_checked="false"
android:color="@color/grey" />
</selector>
使用的彩色材料样式
style="@style/Widget.MaterialComponents.BottomNavigationView.Colored"
也请查看此链接:Hands-on with Material Components
也可以像这样通过编程方式更改颜色:
getMenuInflater().inflate(R.menu.menu_home, menu);
Drawable drawable = menu.findItem(R.id.action_clear).getIcon();
drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable, ContextCompat.getColor(this,R.color.textColorPrimary));
menu.findItem(R.id.action_clear).setIcon(drawable);
return true;
或:
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_favorites:
//need change color of favotites here.
case R.id.action_schedules:
case R.id.action_music:
}
return true;
}
});