Android bottomNavigationView主题样式

时间:2018-11-23 10:45:12

标签: android android-layout themes

我希望我的用户能够更改我的应用程序的(颜色)主题。因此,我们创建了多个主题。

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

2 个答案:

答案 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");