Gezinme çekmecesinde menü öğesinin metin rengini değiştirme


90

Uygulamam için bir gece teması eklemeye çalışıyorum ve gezinme çekmecemdeki metin ve simgelerin koyu arka planla birlikte beyaza dönmesini sağlamak için yaklaşık üç saat harcadım. İşte bunu hakkında gitmeye çalışıyorum yoludur onCreate()içinde 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Çalışır çünkü boolean alakasız. Gece modu açık (0) olarak ayarlandığında, gezinme çekmecesinde seçilen menü öğesi beyaza döner. Ancak, bu yalnızca her öğe seçildiğinde olur ki bu açıkça uygunsuzdur. İşte drawer_dark.xml dosyam:

    <?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>

Her öğe için şeffaf bir arka planda beyaz simgeler kullanıyorum, ancak gezinme çekmecesinin siyah arka planında siyah olarak görünüyorlar. Metnin rengini değiştirmek için bir xml çözümü aradım ve başımı kaşıyordum çünkü bunun neden gözden kaçtığını bilmiyorum.

Başarmaya çalıştığım şeyi elde etmek için biri bana dinamik bir çözüm önerebilir mi? Tüm yardımlar takdir edilmektedir, teşekkür ederim!

DÜZENLEME: Üçüncü taraf bir kitaplık kullanmıyorum, bu, destek kitaplığında sağlanan NavigationView. İşte XML düzeni:

<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>

neden Aktivite temasını Lightolarak Darkve tersini değiştirmiyorsunuz ..
Emil

@Boss, uygulamamın programlanma şekli ile sıkıcı bir süreç olurdu. Gezinme çekmecem dışında her yerde mükemmel çalışan bu gündüz / gece temasına sahibim, bu yüzden tek ihtiyacım olan bunun için bir düzeltme.
wasimsandhu

Yanıtlar:


248
 <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" />

29
Bu, gezinme çekmecesinin her öğesinin rengini "sizin renginize" ayarlayacaktır. Her çekmece grubu için rengi ayrı ayrı değiştirmenin bir yolu var mı?
Akeshwar Jha

2
@Akeshwar, bunu programlı olarak yapmayı deneyebilirsin, ancak Malzeme yönergelerine aykırı olduğu için bunu tavsiye etmem.
Abdellah Benhammou

evet renkleri ayrı ayrı değiştirmenin bir yolu da var!

2
@NehaTyagi xml'den menü öğelerindeki yazı tipi stili nasıl değiştirilir.
Chetan Joshi

@Hara Hara Mahadevaki Lütfen bana söyler misin?
anju jo

44

Navigasyon Görünümünüzde app: itemIconTint kullanın, 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" />

3
ve seçilen öğenin metin rengi ne olacak?
Usman Rana

28

NavigationViewadlı bir yöntemi vardır setItemTextColor(). Bir ColorStateList.

// FOR NAVIGATION VIEW ITEM TEXT COLOR
int[][] state = new int[][] {
        new int[] {-android.R.attr.state_enabled}, // disabled
        new int[] {android.R.attr.state_enabled}, // enabled
        new int[] {-android.R.attr.state_checked}, // unchecked
        new int[] { android.R.attr.state_pressed}  // pressed

};

int[] color = new int[] {
        Color.WHITE,
        Color.WHITE,
        Color.WHITE,
        Color.WHITE
};

ColorStateList csl = new ColorStateList(state, color);


// FOR NAVIGATION VIEW ITEM ICON COLOR
int[][] states = new int[][] {
        new int[] {-android.R.attr.state_enabled}, // disabled
        new int[] {android.R.attr.state_enabled}, // enabled
        new int[] {-android.R.attr.state_checked}, // unchecked
        new int[] { android.R.attr.state_pressed}  // pressed

};

int[] colors = new int[] {
        Color.WHITE,
        Color.WHITE,
        Color.WHITE,
        Color.WHITE
};

ColorStateList csl2 = new ColorStateList(states, colors);

İşte o cevabı aldığım yer burası. Ve sonra NavigationView'umu atadıktan hemen sonra:

if (nightMode == 0) {
            navigationView.setItemTextColor(csl);
            navigationView.setItemIconTintList(csl2);
        }

Merhaba, gezinme çekmecesinin her grubunun rengini ayrı ayrı değiştirmenin bir yolu var mı?
Akeshwar Jha

hala gri rengi

Grup metin rengi nasıl değiştirilir?
Ari

15

Daha fazla seçenek:

"textColorSecondary" öğesini geçersiz kılarak da grup başlığını değiştirebilirsiniz

Styles.xml dosyanızda

<style name="AppTheme.NavigationView">
    <item name="android:textColorSecondary">#FFFFFF</item>
</style>

Senin düzeninde

<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"/>

Bu çözüm, renk sorunumu çözmeme yardımcı oldu. Teşekkür ederim!
Mark Delphi

10

Uygulama ekle : itemTextColor = "# fff" NavigationView'ünüzde şöyle

 <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"/>

6

Uygulamamda Gezinme çekmecesi metin rengini değiştirmek için aşağıdaki kodu kullandım.

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE));

4

Gelecekte, Gezinme Çekmecesi Etkinliğini kullanan biri gelirse (Studio tarafından Etkinlik İstemi penceresinde sağlanır)

Cevap -

Bunu MainActivity'de OnCreate () 'den önce kullanın

int[][] state = new int[][] {
        new int[] {android.R.attr.state_checked}, // checked
        new int[] {-android.R.attr.state_checked}
};

int[] color = new int[] {
        Color.rgb(255,46,84),
        (Color.BLACK)
};

ColorStateList csl = new ColorStateList(state, color);

int[][] state2 = new int[][] {
        new int[] {android.R.attr.state_checked}, // checked
        new int[] {-android.R.attr.state_checked}
};

int[] color2 = new int[] {
        Color.rgb(255,46,84),
        (Color.GRAY)
};

ColorStateList csl2 = new ColorStateList(state2, color2);

ve bunu MainActivity'de onNavigationItemSelected () içinde kullanın (Navigasyon Çekmecesi etkinliğini kullanırsanız bu işlevi yazmanız gerekmez, MainActivity'de eklenecektir).

 NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
    nav.setItemTextColor(csl);
    nav.setItemIconTintList(csl2);
    nav.setItemBackgroundResource(R.color.white);

İpucu - bu kodu onNavigationItemSelected () içindeki If else Koşulundan önce ekleyin


4

Bu benim için çalışıyor. customTheme yerine size temayı stiller halinde koyabilirsiniz. bu kodda yazı tipini ve metin boyutunu da değiştirebilirsiniz.

    <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>

işte benim navigasyon görünümüm

<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>

4

Temanızı navigasyon görünümünüze ekleyerek yapabilirsiniz.

    <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"/>

ve style.xml dosyanıza bu temayı ekleyeceksiniz

   <style name="AppTheme.NavigationView" >
    <item name="colorPrimary">@color/text_color_changed_onClick</item>
    <item name="android:textColorPrimary">@color/Your_default_text_color</item>
</style>

4

Çekmeceleri şurada kullanabilirsiniz:

app: itemTextColor uygulaması: itemIconTint

sonra bir çekilebilir kullanarak kontrol edilen durumu ve normal durumu kontrol edebilirsiniz

<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>

3

bunu java sınıfında dene

yourNavigationView.setItemTextColor(new ColorStateList(
            new int [] [] {
                    new int [] {android.R.attr.state_pressed},
                    new int [] {android.R.attr.state_focused},
                    new int [] {}
            },
            new int [] {
                    Color.rgb (255, 128, 192),
                    Color.rgb (100, 200, 192),
                    Color.WHITE
            }
    ));

2

Bu yardımcı olabilir Benim için çalıştı

Activity_ "gezinti etkinliği adı" .xml gidin Inside NavigationView bu kodu ekleyin

app:itemTextColor="color of your choice"

2

Benim durumumda, sadece bir menü öğesinin rengini değiştirmem gerekiyordu - "Çıkış". Bir özyineleme çalıştırmam ve başlık rengini değiştirmem gerekiyordu:

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);

        }

    }

Bunu Activity'in onCreate yönteminde yaptım.


Neden öğeyi kimliğine göre bulmuyorsunuz?
Ahmed Awadallah

1

Ayrıca temel temanızdan türetilen özel bir tema da tanımlayabilirsiniz:

<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" />

ve sonra styles.xml dosyanızda:

  <style name="MyTheme.NavMenu" parent="MyTheme.Base">
    <item name="android:textColorPrimary">@color/yourcolor</item>
  </style>

ayrıca özel temaya daha fazla özellik uygulayabilirsiniz.


1

Tek bir öğenin tek tek metin rengini değiştirmek için aşağıdaki gibi bir SpannableString kullanın:

SpannableString spannableString = new SpannableString("Menu item"));
        spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary)), 0, spannableString.length(), 0);

menu.findItem(R.id.nav_item).setTitle(spannableString);

0
 <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" />

Uygulamayı kullanarak Öğe Arka Planını ayarlamak için: 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>

0

itemIconTint, simge rengini değiştirmek isterseniz

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:itemTextColor="@color/colorPrimary"
            app:itemIconTint="@color/colorPrimary"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer" />

0

Gezinme Çekmecesinin metin rengini değiştirmek için

kullanırız app:itemTextColor="@color/white"

Gezinme çekmecesinin incon rengini değiştirmek için

kullanım 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"
        />

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.