Я пытаюсь добавить ночную тему для своего приложения, и я потратил почти три часа, просто пытаясь сделать текст и значки в моем навигационном ящике белыми вместе с темным фоном. Вот как я пытаюсь сделать это onCreate()
вMainActivity.java
:
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger onItemClick of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Checking if the item is in checked state or not, if not make it in checked state
if (menuItem.isChecked())
menuItem.setChecked(false);
else menuItem.setChecked(true);
if (nightMode == 0) {
SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spanString.length(), 0); // fix the color to white
menuItem.setTitle(spanString);
}
В nightMode
Булево не имеет значения , потому что она работает. Когда ночной режим включен (0), любой элемент меню, выбранный в панели навигации, становится белым. Однако это происходит только при выборе каждого элемента, что явно неудобно. Вот мой drawer_dark.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:checkableBehavior="single">
<item
android:id="@+id/unitone"
android:checked="true"
android:icon="@drawable/one_white"
android:title="Classical Period" />
<item
android:id="@+id/unittwo"
android:checked="false"
android:icon="@drawable/two_white"
android:title="Postclassical Period" />
<item
android:id="@+id/unitthree"
android:checked="false"
android:icon="@drawable/three_white"
android:title="Early Modern Era" />
<item
android:id="@+id/unitfour"
android:checked="false"
android:icon="@drawable/four_white"
android:title="Dawn of Industrial Age" />
<item
android:id="@+id/unitfive"
android:checked="false"
android:icon="@drawable/five_white"
android:title="Modern Era" />
</group>
</menu>
Я использую белые значки на прозрачном фоне для каждого элемента, но они отображаются черным цветом на черном фоне панели навигации. Я попытался найти xml-решение для изменения цвета текста, и я чешу голову, потому что не знаю, почему это было упущено.
Может ли кто-нибудь предложить мне динамическое решение в достижении того, чего я пытаюсь достичь? Любая помощь приветствуется, спасибо!
РЕДАКТИРОВАТЬ: я не использую стороннюю библиотеку, это NavigationView, предоставленный в библиотеке поддержки. Вот макет XML:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="7dp"
tools:context=".MainActivity"
android:fitsSystemWindows="true" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/ColorDark" />
<include layout="@layout/toolbar" />
</FrameLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:background="#000"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/header"
app:menu="@menu/drawer" />
</android.support.v4.widget.DrawerLayout>
Light
наDark
и наоборот ..Ответы:
<android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:background="#000" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_gravity="start" app:headerLayout="@layout/header" app:itemTextColor="your color" app:menu="@menu/drawer" />
источник
Используйте app: itemIconTint в своем NavigationView, например:
<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:itemTextColor="@color/customColor" app:itemIconTint="@color/customColor" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_home" app:menu="@menu/activity_home_drawer" />
источник
NavigationView
имеет метод под названиемsetItemTextColor()
. Он используетColorStateList
.Вот откуда я получил этот ответ. А затем сразу после назначения моего NavigationView:
источник
Больше вариантов:
вы также можете изменить заголовок группы, переопределив "textColorSecondary"
В вашем файле styles.xml
<style name="AppTheme.NavigationView"> <item name="android:textColorSecondary">#FFFFFF</item> </style>
В вашем макете
<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:menu="@menu/activity_main_menu_drawer_drawer" android:theme="@style/AppTheme.NavigationView" app:itemIconTint="@color/colorPrimary" app:itemTextColor="@color/white"/>
источник
добавьте app: itemTextColor = "# fff" в свой NavigationView, например
<android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" app:menu="@menu/slider_menu" android:background="@color/colorAccent" app:itemTextColor="#fff" android:id="@+id/navigation_view" android:layout_gravity="start"/>
источник
Я использовал приведенный ниже код, чтобы изменить цвет текста ящика навигации в моем приложении.
источник
У меня это работает. вместо customTheme вы можете поместить свою тему в стили. в этом коде вы также можете изменить шрифт и размер текста.
<style name="MyTheme.NavMenu" parent="CustomTheme"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/ssp_semi_bold</item> <item name="android:textColorPrimary">@color/yourcolor</item> </style>
вот мой вид навигации
<android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:theme="@style/MyTheme.NavMenu" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer"> <include layout="@layout/layout_update_available"/> </android.support.design.widget.NavigationView>
источник
Вы можете сделать это просто, добавив свою тему в свой вид навигации.
<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" android:background="@color/colorPrimary" android:theme="@style/AppTheme.NavigationView" app:headerLayout="@layout/nav_header_drawer" app:menu="@menu/activity_drawer_drawer"/>
и в свой файл style.xml вы добавите эту тему
<style name="AppTheme.NavigationView" > <item name="colorPrimary">@color/text_color_changed_onClick</item> <item name="android:textColorPrimary">@color/Your_default_text_color</item> </style>
источник
Вы можете использовать чертежи в
app: itemTextColor app: itemIconTint
тогда вы можете управлять проверенным состоянием и нормальным состоянием, используя рисованный
<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:itemHorizontalPadding="@dimen/margin_30" app:itemIconTint="@drawable/drawer_item_color" app:itemTextColor="@drawable/drawer_item_color" android:theme="@style/NavigationView" app:headerLayout="@layout/nav_header" app:menu="@menu/drawer_menu">
drawer_item_color.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/selectedColor" android:state_checked="true" /> <item android:color="@color/normalColor" /> </selector>
источник
попробуйте это в классе Java
источник
В будущем, если кто-нибудь придет сюда, воспользуется активностью навигационного ящика (предоставляется Studio в окне подсказки действий)
Ответ -
Используйте это перед OnCreate () в MainActivity
и используйте это в onNavigationItemSelected () в MainActivity (вам не нужно писать эту функцию, если вы используете действие Navigation Drawer, она будет добавлена в MainActivity).
Совет - добавьте этот код перед условием If else в onNavigationItemSelected ()
источник
Это может помочь Это сработало для меня
источник
Вы также можете определить настраиваемую тему, производную от вашей базовой темы:
<android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:id="@+id/nav_view" app:headerLayout="@layout/nav_view_header" app:menu="@layout/nav_view_menu" app:theme="@style/MyTheme.NavMenu" />
а затем в вашем файле styles.xml:
<style name="MyTheme.NavMenu" parent="MyTheme.Base"> <item name="android:textColorPrimary">@color/yourcolor</item> </style>
вы также можете применить дополнительные атрибуты к настраиваемой теме.
источник
Чтобы изменить цвет текста отдельного элемента, используйте SpannableString, как показано ниже:
источник
В моем случае мне нужно было изменить цвет только одного пункта меню - «Выход». Мне пришлось запустить рекурсию и изменить цвет заголовка:
NavigationView nvDrawer; Menu menu = nvDrawer.getMenu(); for (int i = 0; i < menu.size(); i ++){ MenuItem menuItem = menu.getItem(i); if (menuItem.getTitle().equals("Logout")){ SpannableString spanString = new SpannableString(menuItem.getTitle().toString()); spanString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), 0, spanString.length(), 0); menuItem.setTitle(spanString); } }
Я сделал это в методе onCreate Activity.
источник
<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:itemBackground="@drawable/drawer_item_bg" app:headerLayout="@layout/nav_header_home" app:menu="@menu/app_home_drawer" />
Чтобы установить фон элемента с помощью app: itemBackground
drawer_item_bg.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" > <solid android:color="@android:color/transparent" /> </shape> </item> <item android:top="-2dp" android:right="-2dp" android:left="-2dp"> <shape> <padding android:bottom="0dp" android:left="15dp" android:right="0dp" android:top="0dp"/> <solid android:color="@android:color/transparent" /> <stroke android:width="0.5dp" android:color="#CACACA" /> </shape> </item> </layer-list>
источник
itemIconTint, если вы хотите изменить цвет значка
источник
для изменения цвета текста на панели навигации
мы используем
app:itemTextColor="@color/white"
изменить цвет панели навигации.
использовать
app:itemIconTint="@color/black"
<com.google.android.material.navigation.NavigationView android:id="@+id/naView" app:itemIconTint="@color/black" android:layout_width="match_parent" app:menu="@menu/navmenu" app:itemTextColor="@color/white" app:headerLayout="@layout/nav_header" android:layout_height="match_parent" app:itemTextAppearance="?android:textAppearanceMedium" android:fitsSystemWindows="true" android:layout_gravity="start" />
источник