Android bottomNavigationView Стилизация по темам - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу, чтобы мои пользователи могли изменять (цветную) тему моего приложения.Поэтому мы создаем несколько тем.

<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 голосов
/ 29 мая 2019

это не совсем тот ответ, который вы искали, но, поскольку я пытался сделать то же самое, но безуспешно, я нашел обходной путь, поэтому, сделав ваши темы в 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" />

Существуют различные версии этого стиля, которые можно найти здесь , это работает, но вам все равно нужно будет что-то сделать для значков итекст, поэтому у меня есть оператор переключения и в зависимости от цвета (темный или светлый) я переключаю список состояний цвета следующим образом

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);
      }

опять не то, что вы или я искали, но работает и может быть хуже, надеюсь, это поможет

0 голосов
/ 23 ноября 2018

Я считаю, что это должно работать

<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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...