Próbuję dodać motyw nocny do mojej aplikacji i zmarnowałem prawie trzy godziny, próbując zmienić kolor tekstu i ikon w szufladzie nawigacji na biały wraz z ciemnym tłem. Oto sposób, w jaki próbuję to zrobić onCreate()
w 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);
}
Wartość nightMode
logiczna nie ma znaczenia, ponieważ działa. Gdy tryb nocny jest włączony (0), dowolna pozycja menu wybrana w szufladzie nawigacji zmienia kolor na biały. Jednak dzieje się tak tylko wtedy, gdy wybrany jest każdy element, co jest oczywiście niewygodne. Oto mój 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>
Używam białych ikon na przezroczystym tle dla każdego elementu, ale są one wyświetlane jako czarne na czarnym tle szuflady nawigacji. Próbowałem znaleźć rozwiązanie XML do zmiany koloru tekstu i drapię się po głowie, ponieważ nie wiem, dlaczego zostało to przeoczone.
Czy ktoś może zaoferować mi dynamiczne rozwiązanie w uzyskaniu tego, co próbuję osiągnąć? Każda pomoc jest mile widziana, dziękuję!
EDYCJA: Nie używam biblioteki innej firmy, jest to NavigationView udostępniona w bibliotece pomocy technicznej. Oto układ 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
naDark
i odwrotnie ...Odpowiedzi:
<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" />
źródło
Użyj app: itemIconTint w swoim 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" />
źródło
NavigationView
ma metodę o nazwiesetItemTextColor()
. UżywaColorStateList
.Oto, gdzie otrzymałem tę odpowiedź. A potem zaraz po przypisaniu mojego NavigationView:
źródło
Więcej opcji:
możesz także zmienić tytuł grupy, zastępując „textColorSecondary”
W pliku styles.xml
<style name="AppTheme.NavigationView"> <item name="android:textColorSecondary">#FFFFFF</item> </style>
W twoim układzie
<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"/>
źródło
dodaj aplikację: itemTextColor = "# fff" w swoim NavigationView, np
<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"/>
źródło
Użyłem poniższego kodu, aby zmienić kolor tekstu szuflady nawigacji w mojej aplikacji.
źródło
To działa dla mnie. zamiast customTheme możesz umieścić swój motyw w stylach. w tym kodzie możesz również zmienić czcionkę i rozmiar tekstu.
<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>
oto mój widok nawigacji
<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>
źródło
Możesz to zrobić po prostu dodając motyw do widoku nawigacji.
<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"/>
aw swoim pliku style.xml dodasz ten motyw
<style name="AppTheme.NavigationView" > <item name="colorPrimary">@color/text_color_changed_onClick</item> <item name="android:textColorPrimary">@color/Your_default_text_color</item> </style>
źródło
Możesz używać drawables w
app: itemTextColor app: itemIconTint
następnie możesz kontrolować stan zaznaczenia i stan normalny za pomocą rysowalnego
<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>
źródło
spróbuj tego w klasie java
źródło
W przyszłości, jeśli ktoś przyjdzie tutaj, korzystając z działania szuflady nawigacji (udostępnianej przez Studio w oknie monitu o działanie)
Odpowiedź to -
Użyj tego przed OnCreate () w MainActivity
i użyj tego w onNavigationItemSelected () w MainActivity (nie musisz pisać tej funkcji, jeśli używasz działania Navigation Drawer, zostanie ona dodana w MainActivity).
Wskazówka - dodaj ten kod przed warunkiem If else w onNavigationItemSelected ()
źródło
To może pomóc. U mnie zadziałało
źródło
Możesz również zdefiniować motyw niestandardowy pochodzący z motywu podstawowego:
<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" />
a następnie w pliku styles.xml:
<style name="MyTheme.NavMenu" parent="MyTheme.Base"> <item name="android:textColorPrimary">@color/yourcolor</item> </style>
możesz również zastosować więcej atrybutów do motywu niestandardowego.
źródło
Aby zmienić indywidualny kolor tekstu w pojedynczym elemencie, użyj SpannableString, jak poniżej:
źródło
W moim przypadku potrzebowałem zmienić kolor tylko jednej pozycji menu - „Wyloguj”. Musiałem uruchomić rekursję i zmienić kolor tytułu:
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); } }
Zrobiłem to w metodzie onCreate działania.
źródł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" app:itemBackground="@drawable/drawer_item_bg" app:headerLayout="@layout/nav_header_home" app:menu="@menu/app_home_drawer" />
Aby ustawić tło elementu za pomocą aplikacji: 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>
źródło
itemIconTint, jeśli chcesz zmienić kolor ikony
źródło
aby zmienić kolor tekstu szuflady nawigacji
Używamy
app:itemTextColor="@color/white"
aby zmienić kolor nawigacji w szufladzie
posługiwać się
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" />
źródło