Изменение цвета фона в BottomNavigationView
я реализовал BottomNavigationView
, который доступен из новой библиотеки поддержки 25.0.0. Вот мой код
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@drawable/text"
app:itemTextColor="@drawable/text"
app:menu="@menu/bottom_navigation_main" />
и text.xml
drawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white" android:state_enabled="true" />
<item android:color="@color/colorPrimaryDark" android:state_enabled="false" />
</selector>
С помощью этого кода я могу изменить цвет текста при нажатии пункта меню, но когда я применяю то же самое к app:itemBackground
он показывает ошибки <item> tag requires a 'drawable' attribute or child tag defining a drawable
.
это то, что я пробовал app:itemBackground
app:itemBackground="@drawable/text"
так мой вопрос как я могу изменить цвет фона выбранного пункт меню?
3 ответов
нашел ответ из этого средний пост
- нужно использовать
android:state_checked
вместоandroid:state_enabled
- внутри
onNavigationItemSelected
вам нужно использоватьreturn true
вместоreturn false
.
и установить фон, мы не можем использовать android:color
на <item>
, нам нужно использовать android:drawable
Итак, вот как это выглядит xml-файл, Когда вы устанавливаете его для app:itemTextColor
и app:itemIconTint
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimaryDark" android:state_checked="true" />
<item android:color="@android:color/white" android:state_checked="false" />
</selector>
и набор app:itemBackground
селектор
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/banner_white" android:state_checked="true"/>
<item android:drawable="@drawable/banner_green" android:state_checked="false"/>
</selector>
здесь banner_white
и banner_green
являются pngs.
я столкнулся с аналогичной проблемой для OP, но немного другой. Если вы ставите sth как@color/color_selector
в BottomNavigationView app:itemBackground="___"
. Это заставит вид скрываться в панели дизайна, а приложение раздавить при запуске. Хотя он отлично работает, если вы просто установите его в постоянный цвет, например @color/black
.
для более подробного объяснения я углубился в ссылку на api android. Теперь я думаю, что нашел ответ, который может разумно решить эту проблему. (Может отсутствовать точный.)
проблема то, что вы предоставляете, не совсем то, что они просили.
app:itemIconTint
и app:itemTextColor
попросите шестигранный цвет, в то время как app:itemBackground
просит буквально Drawable. The <color>
элементы мы пишем colors.xml
are ColorDrawable. Это происходит от Drawable таким образом, он может кормить все три атрибута.
однако, когда вы изменяете его для использования селектор, все меняется. Оба цвета hex и drawable имеют соответствующий селектор. Селектор действует как ресурс, который вы вводите, но результат не является оригинальным. Это больше похоже на одноразовую обертку. Вы не можете передать шестнадцатеричный цвет атрибуту, который требует Drawable.
цвета на самом деле ColorStateList, обеспечивает шестнадцатеричный цвет, находится в res/color
. Вы можете использовать только атрибут android:color
в этом файле. это вызовет ошибку, если вы напишите android:drawable
.
Drawable селектор StateListDrawable, обеспечивает рисование, находится в res/drawable
. Вы должны написать android:drawable
здесь, но нет ошибки, если вы пишете android:color
.
android:color
предоставляет только шестнадцатеричный цвет, который не может быть распознан как Drawable, а app:itemBackground
требует Drawable, так что приложение обречен. (прямой причина)
оба атрибута (android:color
и android:drawable
) признать ColorDrawable, здесь он работает так же, как при установке постоянного цвета.
решение (и практика):
-
использовать (и только)
android:drawable
наres/drawable/drawable_selector.xml
. Пример:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/colorAccent" android:state_checked="true" /> <item android:drawable="@color/colorAccentDark" /> </selector>
-
использовать
res/color/color_selector.xml
когда он нужен hex цвет (чтобы избежать путаницы). Пример:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@android:color/white" android:state_checked="true"/> <item android:color="@color/colorPrimary" /> </selector>
-
обеспечить
app:itemBackground
С drawable. Пример:<android.support.design.widget.BottomNavigationView ... app:itemBackground="@drawable/drawable_selector" app:itemIconTint="@color/color_selector" app:itemTextColor="@color/color_selector" ... />
(стоит отметить, что если вы используете Android Studio, его функция автоматического завершения скажет вам, какие атрибуты являются законными и доступными, и он не предлагает вам android:color
в селекторе под res/drawable
!)
попробуйте это пример кода навигационного элемента select listener. надеюсь, это вам поможет.
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
// update highlighted item in the navigation menu
menuItem.setChecked(true);
mNavItemId = menuItem.getItemId();
// allow some time after closing the drawer before performing real navigation
// so the user can see what is happening
mDrawerLayout.closeDrawer(GravityCompat.START);
mDrawerActionHandler.postDelayed(new Runnable() {
@Override
public void run() {
navigate(menuItem.getItemId());
}
}, DRAWER_CLOSE_DELAY_MS);
return true;
}
альтернативное решение:
сделать drawable файл highlight_color.XML со следующим содержанием :
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="YOUR HIGHLIGHT COLOR"/>
</shape>
сделайте еще один drawable файл nav_item_drawable.XML со следующим содержанием:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/highlight_color" android:state_checked="true"/>
</selector>
наконец добавить приложение: itembackground тег в NavView:
<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
app:itemBackground="@drawable/nav_item_drawable"
app:menu="@menu/menu_drawer">
в highlight_color.xml-файл определяет сплошной цвет для рисования для фона. Позже этот цвет drawable присваивается nav_item_drawable.в XML-селектор.
попробуйте этот.