Estou tentando adicionar um tema noturno para meu aplicativo e perdi quase três horas tentando fazer o texto e os ícones na minha gaveta de navegação ficarem brancos junto com o fundo escuro. Esta é a maneira como estou tentando fazer isso onCreate()
em 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);
}
O nightMode
booleano é irrelevante porque funciona. Quando o modo noturno está ativado (0), qualquer item de menu selecionado na gaveta de navegação fica branco. No entanto, isso só acontece quando cada item é selecionado, o que é obviamente inconveniente. Aqui está meu 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>
Estou usando ícones brancos em um fundo transparente para cada item, mas eles aparecem como preto no fundo preto da gaveta de navegação. Tentei procurar uma solução xml para alterar a cor do texto e estou coçando a cabeça porque não sei por que isso foi esquecido.
Alguém pode me oferecer uma solução dinâmica para conseguir o que estou tentando alcançar? Toda ajuda é apreciada, obrigado!
EDIT: Não estou usando uma biblioteca de terceiros, é o NavigationView fornecido na biblioteca de suporte. Este é o layout 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
paraDark
e vice-versa ..Respostas:
<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" />
fonte
Use app: itemIconTint em seu NavigationView, ej:
<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" />
fonte
NavigationView
tem um método chamadosetItemTextColor()
. Ele usa umColorStateList
.Aqui é onde eu obtive essa resposta. E logo após atribuir minha NavigationView:
fonte
Mais opções:
você também pode alterar o título do grupo substituindo "textColorSecondary"
Em seu styles.xml
<style name="AppTheme.NavigationView"> <item name="android:textColorSecondary">#FFFFFF</item> </style>
Em seu layout
<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"/>
fonte
adicione app: itemTextColor = "# fff" em seu NavigationView como
<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"/>
fonte
Usei o código abaixo para alterar a cor do texto da gaveta de navegação em meu aplicativo.
fonte
No futuro, se alguém vier aqui usando, Navigation Drawer Activity (fornecida pelo Studio na janela Activity Prompt)
A resposta é -
Use isto antes de OnCreate () em MainActivity
e use isso em onNavigationItemSelected () em MainActivity (você não precisa escrever esta função se usar a atividade Navigation Drawer, ela será adicionada em MainActivity).
Dica - adicione este código antes de If else Condition in onNavigationItemSelected ()
fonte
Isso funciona para mim. em vez de customTheme, você pode colocar seu tema em estilos. neste código, você também pode alterar a fonte e o tamanho do texto.
<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>
aqui está minha visão de navegação
<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>
fonte
Você pode fazer isso simplesmente adicionando seu tema à visualização de navegação.
<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"/>
e em seu arquivo style.xml, você adicionará este tema
<style name="AppTheme.NavigationView" > <item name="colorPrimary">@color/text_color_changed_onClick</item> <item name="android:textColorPrimary">@color/Your_default_text_color</item> </style>
fonte
Você pode usar drawables em
app: itemTextColor app: itemIconTint
então você pode controlar o estado verificado e o estado normal usando um drawable
<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>
fonte
tente isso na classe java
fonte
Isso pode ajudar funcionou para mim
fonte
No meu caso, precisei mudar a cor de apenas um item do menu - "Logout". Tive que executar uma recursão e alterar a cor do título:
Eu fiz isso no método onCreate da Activity.
fonte
Você também pode definir um tema personalizado derivado de seu tema base:
<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" />
e em seu arquivo styles.xml:
<style name="MyTheme.NavMenu" parent="MyTheme.Base"> <item name="android:textColorPrimary">@color/yourcolor</item> </style>
você também pode aplicar mais atributos ao tema personalizado.
fonte
Para alterar a cor do texto individual de um único item, use um SpannableString como abaixo:
fonte
<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" />
Para definir o plano de fundo do item usando o 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>
fonte
itemIconTint, se você quiser mudar a cor do ícone
fonte
para alterar a cor do texto da gaveta de navegação
nós usamos
app:itemTextColor="@color/white"
mudar a cor da gaveta de navegação
usar
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" />
fonte