我希望我的用户能够更改我的应用程序的(颜色)主题。因此,我们创建了多个主题。
<resources>
<!-- First Theme -->
<style name="themeOne" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">@color/themeOneColorPrimary</item>
<item name="colorPrimaryDark">@color/themeOneColorPrimaryDark</item>
<item name="colorAccent">@color/themeOneAccent</item>
<item name="android:background">@color/themeOneBackground</item>
...
</style>
<!-- Second Theme -->
<style name="themeTwo" parent="Theme.AppCompat.Light.NoActionBar">
...
</style>
现在,我想更改BottomNavigationView的外观。但是找不到有关此操作的示例。
<android.support.design.widget.BottomNavigationView
android:id="@+id/nav_bottom"
app:menu="@menu/nav_bottom"
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"
答案 0 :(得分:1)
这并不是您一直在寻找的答案,但是当我尝试做同样的事情没有成功时,我找到了一种解决方法,因此可以通过使styles.xml中的主题继承自材料组件(如果它们不存在)。没错,您可以使用.bridge使它们更像appcompat主题),您可以更改底部导航的背景,例如我的黄色主题
<style name="MyAppYellowTheme" parent="Theme.MaterialComponents.Light.Bridge">
<item name="colorPrimary">@color/primary_yellow</item>
<item name="colorPrimaryDark">@color/primary_dark_yellow</item>
<item name="colorAccent">@color/accent_yellow</item>
<item name="android:textColorPrimary">@color/primary_text_yellow</item>
<item name="android:colorBackground">@color/background_light</item>
<item name="tabLayoutStyle">@style/Yellow.TabLayout</item>
</style>
如果我向其添加材质样式,它将使我的底部导航背景颜色= colorPrimary
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.BottomNavigationView.Colored"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/navigation" />
此样式有不同的版本,here可以使用,但是您仍然需要对图标和文本进行某些操作,因此我有一个switch语句,并且基于颜色(深色或浅色) )我像这样切换颜色状态列表
ColorStateList colorStateList = getBottomNavColor(theme, getActivity());
navigationView.setItemIconTintList(colorStateList);
navigationView.setItemTextColor(colorStateList);
getBottomNavController
private ColorStateList getBottomNavColor(String theme, Context context){
switch (theme) {
case Constants.THEME_BLUE:
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_blue);
case Constants.THEME_YELLOW:
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_yellow);
case Constants.THEME_GREEN:
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_green);
case Constants.THEME_RED:
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_red);
case Constants.THEME_PURPLE:
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_purple);
case Constants.THEME_PINK:
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_pink);
}
return ContextCompat.getColorStateList(context,R.drawable.bottom_nav_selector_blue);
}
再次找不到您或我想要的东西,但确实有用,并且可能会更糟,希望对您有所帮助
答案 1 :(得分:0)
我相信这应该有效
<style name="BottomNavTheme" parent="Widget.Design.BottomNavigationView">
<item name="app:itemBackground">@color/colorPrimary</item>
<item name="app:itemIconTint=">@color/white</item>
<item name="app:itemTextColor=">@color/white</item>
</style>
然后将其添加到您的XML
android:theme="@style/BottomNavTheme"
例如,您还可以使用Java分别更改商品的样式
private Menu myMenu;
BottomNavigationView menu = findViewById(R.id.your_menu_id);
myMenu = menu.getMenu();
myMenu.findItem(R.id.your_menu_item_id).setIcon(R.drawable.your_new_icon);
myMenu.findItem(R.id.your_menu_item_id).setTitle("some text");