Korzystam z nowej biblioteki Android Design Support, aby zaimplementować szufladę nawigacji w mojej aplikacji.
Nie mogę wymyślić, jak zmienić kolor wybranej pozycji!
Oto XML menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/navigation_item_1"
android:icon="@drawable/ic_1"
android:title="@string/navigation_item_1"/>
<item
android:id="@+id/navigation_item_2"
android:icon="@drawable/ic_2"
android:title="@string/navigation_item_2"/>
</group>
A oto plik navigationview xml, który znajduje się wewnątrz android.support.v4.widget.DrawerLayout
:
<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:menu="@menu/menu_drawer">
<TextView
android:id="@+id/main_activity_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:textColor="@color/primary_text" />
</android.support.design.widget.NavigationView>
Dziękuję za pomoc!
[EDYTUJ] Spojrzałem już na rozwiązania takie jak to: Zmień kolor tła menu Androida .
Wydaje się, że to niezły hack i pomyślałem, że dzięki nowej bibliotece Design Support Library zostanie wprowadzone coś czystszego?
Odpowiedzi:
Cóż, możesz to osiągnąć za pomocą zasobu stanu koloru . Jeśli zauważysz, że w środku
NavigationView
używaszTutaj zamiast używać
@color/black
lub@color/primary_test
, użyj plikuColor State List Resource
. W tym celu najpierw utwórz nowyxml
(np. Drawer_item.xml) wewnątrzcolor
katalogu (który powinien znajdować się wres
katalogu). Jeśli nie masz jeszcze nazwanego katalogucolor
, utwórz go.Teraz w środku
drawer_item.xml
zrób coś takiegoOstatnim krokiem byłaby zmiana
NavigationView
Jak to można użyć oddzielnych Kolor Stan List Zasoby dla
IconTint
,ItemTextColor
,ItemBackground
.Teraz, gdy ustawisz element jako zaznaczony (w trybie
xml
lub programowo), określony element będzie miał inny kolor niż elementy niezaznaczone.źródło
Myślę, że
app:itemBackground
oczekuje rysowalnego. Więc wykonaj poniższe czynności:Utwórz plik do rysowania
highlight_color.xml
z następującą zawartością:Utwórz kolejny plik do rysowania
nav_item_drawable.xml
z następującą zawartością:Na koniec dodaj
app:itemBackground
tag w NavView:tutaj plik highlight_color.xml definiuje jednolity kolor, który można narysować jako tło. Później ten kolor do rysowania jest przypisany do selektora nav_item_drawable.xml.
To zadziałało dla mnie. Mam nadzieję, że to pomoże.
********************************************** AKTUALIZACJA *** *******************************************
Chociaż powyższa odpowiedź daje ci dobrą kontrolę nad niektórymi właściwościami, ale sposób, w jaki mam zamiar opisać, wydaje się bardziej SOLIDNY i nieco chłodniejszy .
Możesz więc zdefiniować ThemeOverlay w
styles.xml
widoku NavigationView w następujący sposób:teraz zastosuj to ThemeOverlay do
app:theme
atrybutu NavigationView, na przykład:Mam nadzieję, że to pomoże.
źródło
android:background="@drawable/nav_item_drawable"
przypadku innych widżetów, takich jak RadioButton, Checkbox, Button itp. Redukuje programowanie typu bloatware do obsługisetOnCheckedChangeListener
tylko podświetlania kolorów.Należy ustawić
NavigateItem
zaznaczone na true po każdymNavigateView
kliknięciu elementuDodaj
NavigationItemSelectedListener
naNavigationView
źródło
setChecked(true)
). Widzę, jak zmienia się kolor zaznaczonego elementu, ale nie mogę go samodzielnie zmodyfikować, kolor jest zawsze jaśniejszą wersją tła widoku nawigacji.setChecked(true)
naView
kolor tła zapisu do zmiany tematu, że urządzenie, którego używa. Jeśli chcesz zmienić tło elementu na inny kolor, musisz nadmuchać układ wDrawerLayout
lubNavigationView
i poradzić sobie samodzielnie.Oto inny sposób, aby to osiągnąć:
}
źródło
Oto, jak możesz to zrobić w metodzie onCreate swojej aktywności:
źródło
Krok 1: Zbuduj zaznaczony / niezaznaczony selektor:
selector.xml
Krok 2: użyj atrybutu xml
app:itemTextColor
wNavigationView
widgecie, aby wybrać kolor tekstu.Krok 3:
Z jakiegoś powodu, gdy trafisz na element z
NavigationView
menu, nie uważa tego za sprawdzenie przycisku. Musisz więc ręcznie sprawdzić wybrany element i wyczyścić poprzednio wybrany element. Użyj poniższego listenera, aby to zrobićKrok 4:
Aby zmienić kolor ikony, użyj
app:iconTint
atrybutu wNavigationView
pozycjach menu i ustaw ten sam selektor.Wynik:
źródło