2016-10-27 1 views
-1

Есть ли способ установить цвет фона в новых библиотеках дизайна BottomNavigationView в коде для пользовательского значения цвета вместо ресурса цвета? Может быть, какой-нибудь «трюк»?Дизайн BottomNavigationView - установить цвет фона в коде

Мое текущее решение:

  • я сделать BottomNavigationView прозрачным
  • добавить второй вид за bottomNavigationView
  • я обновляю фоне этой точки зрения в

Но это выглядит некрасиво, особенно так как я должен использовать настраиваемое поведение для фонового представления для анимирования параллельно с BottomNavigationView в родительском CoordinatorLayout ...

ответ

3

Решил сам.

Решение 1

Я просто настроить все элементы с прозрачным фоном (это требуется только один файл ресурсов), а затем я тема по BottomNavigationView фактический сам фон. рисуем

bottomBar.setBackground(new ColorDrawable(color)); 
bottomBar.setItemBackgroundResource(R.drawable.transparent); 

Ресурс - transparent.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="@android:color/transparent" /> 
</shape> 

Решение 2 - с помощью отражения (поддержка библиотеки 25.0.0)

public void themeBottomBarBackgroundWithReflection(BottomNavigationView bottomBar, int color) 
{ 
    try 
    { 
     Field mMenuViewField = BottomNavigationView.class.getDeclaredField("mMenuView"); 
     mMenuViewField.setAccessible(true); 
     BottomNavigationMenuView mMenuView = (BottomNavigationMenuView)mMenuViewField.get(bottomBar); 
     Field mButtonsField = BottomNavigationMenuView.class.getDeclaredField("mButtons"); 
     mButtonsField.setAccessible(true); 
     BottomNavigationItemView[] mButtons = (BottomNavigationItemView[])mButtonsField.get(mMenuView); 

     for (BottomNavigationItemView item : mButtons) { 
      ViewCompat.setBackground(item, new ColorDrawable(color)); 
     } 
    } 
    catch (NoSuchFieldException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IllegalAccessException e) 
    { 
     e.printStackTrace(); 
    } 
}