Android'de Menü öğesinin Metin rengi nasıl değiştirilir?


175

Android'de bir Menü öğesinin arka plan rengini değiştirebilir miyim?

Bunun herhangi bir çözümü olup olmadığını lütfen bize bildirin. Son seçenek açıkça özelleştirmek olacaktır, ancak metin rengini özelleştirmeden değiştirmenin herhangi bir yolu vardır.


Bunun çözümünü bana bildirebilecek biri var mı?
sunil

3
metin rengini, metin görünümünün arka plan rengini değiştirmek ister misiniz? ya da her ikisi de? Her ikisi de farklı şeyler. Lütfen soruyu yeniden çerçevelendirin.
Abhinav Saxena

Yanıtlar:


335

Temanızdaki basit bir satır :)

<item name="android:actionMenuTextColor">@color/your_color</item>

19
NOT: Bu, actionBarStyleörneğin içinde DEĞİL, uygulamanızın ana Tema tanımına girmelidir ZORUNLU . Bu actionBarStylemantıklı görünse de, içeride çalışmayacak !
Colin

47
Daha düşük API sürümlerini desteklemek <item name="actionMenuTextColor">@color/your_color</item>için Android ad alanını kullanmayın
alex.p

5
@ColinM. Bir temaya gitmeli . Araç themeçubuğunuzda bir özellik ayarlarsanız , bu işe yarar.
DariusL

2
Benim için ya android ile ya da android: namespace çalışma değildi. Ana uygulama temasına eklendi.
racs

2
Metin rengini hala tamamen değiştiremiyorum. Genel tema metin rengim sadece tercih ediyor. Herhangi bir yardım? Bu cevapların hiçbiri işe yaramıyor.
David P

115

Öyle görünüyor ki

  <item name="android:itemTextAppearance">@style/myCustomMenuTextAppearance</item>

temamda ve

   <style name="myCustomMenuTextAppearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@android:color/primary_text_dark</item>
    </style>

styles.xml dosyasında liste öğelerinin stilini değiştirin, ancak menü öğelerinin stilini değiştirin.


5
Bu aradığım şey olan bağlam menü öğeleri (menü düğmesinden menü öğeleri değil) için harika çalışıyor. Tüm LayoutFactory karmaşasından çok daha basit.
chubbsondubs

android:itemTextAppearanceNitelik olan ebeveyn olan bir stil içinde yerleştirilemez parent="@android:style/Widget.Holo.ListPopupWindow"düzgün hale etkileri olmaz. Üst öğesi gibi üst düzey bir tarzda olmalıdır android:Theme.Holo.Light.DarkActionBar.
toobsco42

<İtem name = "android: itemTextAppearance"> @ style / myCustomMenuTextApearance </item> 'i nereye eklemeliyim?
Bagusflyer

@bagusflyer sen yani çocuğudur tarzı, Temanızın kök tarzında olduğunu eklemek gerekir Theme.Holoya Theme.Holo.Light.DarkActionBarveya benzer.
Tash Pemhiwa

86

Bunun yerine MenuItemkullanarak metnin rengini kolayca değiştirebilirsiniz .SpannableStringString

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu, menu);

    int positionOfMenuItem = 0; // or whatever...
    MenuItem item = menu.getItem(positionOfMenuItem);
    SpannableString s = new SpannableString("My red MenuItem");
    s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
    item.setTitle(s);
}

10
Bu kullanarak 5+ hem 4.4 benim için çalıştı ve menu.findItem(R.id.menu_item_id);yerinemenu.getItem()
haagmm

1
Benim için de çalıştı [findItem (...) kullanarak].
sersemlemiş

6
çözümler sadece taşma öğe için çalışır .... i showAsAction ayarlayarak görünür öğe rengini değiştirmek istemiyorum: "her zaman"
Junaid

56

Yeni Araç Çubuğu'nu tema ile birlikte kullanıyorsanız, Theme.AppCompat.Light.NoActionBarbunu aşağıdaki şekilde biçimlendirebilirsiniz.

 <style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:textColorPrimary">@color/my_color1</item>
    <item name="android:textColorSecondary">@color/my_color2</item>
    <item name="android:textColor">@color/my_color3</item>
 </style>`

Elde ettiğim sonuçlara göre
android:textColorPrimary, araç çubuğunun birincil metni olan etkinliğinizin adını gösteren metin rengi.

android:textColorSecondaryaltyazı ve daha fazla seçenek (3 nokta) düğmesi için metin rengidir. (Evet, bu özelliğe göre rengini değiştirdi!)

android:textColorMenü de dahil olmak üzere diğer tüm metinlerin rengidir.

Son olarak temayı Araç Çubuğuna ayarlayın

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:theme="@style/ToolbarTheme"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"/>

Hangi öğe, araç çubuğunda eylemler (metin) olarak gösterilen düğmelerdeki metni yönetir? Ne android: textColorPrimary, android: textColorSeincil, ne de android: textColor onları etkiliyor gibi görünüyor.
LarsH

Önceki yorumdaki soruma cevap olarak: android:actionMenuTextColor(bkz. Stackoverflow.com/a/5538709/423105 ).
LarsH

32

Menüyü şu şekilde kullanıyorsanız, <android.support.design.widget.NavigationView />aşağıdaki satırı ekleyin NavigationView:

app:itemTextColor="your color"

Ayrıca simge için colorTint, simge için de rengi geçersiz kılar. Bunun için aşağıdaki satırı eklemelisiniz:

app:itemIconTint="your color"

Misal:

<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/color_white"
        app:itemIconTint="@color/color_white"

        android:background="@color/colorPrimary"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

Umarım size yardımcı olur.


Bu, başka bir öğeye yuvalanmış öğeleri değiştirdi, ancak diğer öğeleri içeren öğeyi değiştirmedi. Onları nasıl değiştirebileceğimi biliyor musun?
Dinu Nicolae

@DinuNicolae Lütfen örnek ekran görüntünüzü gönderebilir misiniz? Veya daha fazla ayrıntı sağlayın.
Mihir Trivedi

<item> <menu> <iç öğeler> </menu> </item> vardı ve sadece içindeki öğelerin rengi değişti
Dinu Nicolae

31

Programlı olarak şöyle devam ettim:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.changeip_card_menu, menu); 
    for(int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
        spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0,     spanString.length(), 0); //fix the color to white
        item.setTitle(spanString);
    }
    return true;
}

2
cevabınız MenuItem metnini kalın yapmama yardımcı oldu. (s.setSpan (yeni StyleSpan (android.graphics.Typeface.BOLD), 0, s.length (), 0); Teşekkürler!
Arkadiusz Cieśliński

Bu çözüm sorunuma yardımcı oldu. Temayı tekrar eden koşullara bağlı olmayacağından bunu beğendim.
Tomcat

15

bu soruda görebileceğiniz gibi :

<item name="android:textColorPrimary">yourColor</item>

Yukarıdaki kod, API> = v21 için menü eylem öğelerinin metin rengini değiştirir.

<item name="actionMenuTextColor">@android:color/holo_green_light</item>

Yukarıdaki API <v21 kodu


Teşekkür ederim. Bu kabul edilmelidir. Çok basit ve kolay
Pooja

10

Menü öğesi şişirildiğinde tek bir öğenin metin rengini değiştirmek için html etiketini kullandım. Umarım faydalı olur.

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    menu.findItem(R.id.main_settings).setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
    return true;
}

1
Bu benim için Marshmallow'da işe yaramıyor. Metin uygulanır, ancak renk uygulanmaz.
Ollie C

Marshmallow ile ilgili olarak, muhtemelen max.mustermann'ın cevabında belirtilen aynı nedenden ötürü işe yaramıyor, "çözümler sadece taşan eşya için çalışıyor."
Jose_GD

10

AppTheme için değil, tek araç çubuğu için özel menü rengi yapmanın en basit yolu

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay.MenuBlue">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>
    </android.support.design.widget.AppBarLayout>

styles.xml üzerinde her zamanki araç çubuğu

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>

özel araç çubuğu stilimiz

<style name="AppTheme.AppBarOverlay.MenuBlue">
    <item name="actionMenuTextColor">@color/blue</item>
</style>

Harika çalışıyor! En iyi cevap.
bebe

9

Kotlin de şu uzantıları yazdım:

fun MenuItem.setTitleColor(color: Int) {
    val hexColor = Integer.toHexString(color).toUpperCase().substring(2)
    val html = "<font color='#$hexColor'>$title</font>"
    this.title = html.parseAsHtml()
}           



@Suppress("DEPRECATION")                                                                        
fun String.parseAsHtml(): Spanned {                                                             
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {                                
        Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)                                         
    } else {                                                                                    
        Html.fromHtml(this)                                                                     
    }                                                                                           
}  

ve şu şekilde kullanılır:

menu.findItem(R.id.main_settings).setTitleColor(Color.RED)

Gerçekten bu çözüm gibi, çok temiz!
Jamil Nawaz

Teşekkürler, basit ve hızlı bir çözüm. API> 24 için bu ikinci dahili fonksiyon olmadan çalışır
laszlo

7

Kısa cevap EVET. seni şanslı!
Bunu yapmak için, Android varsayılan stillerinin bazı stillerini geçersiz kılmanız gerekir:

İlk olarak, Android'deki temaların tanımına bakın :

<style name="Theme.IconMenu">
<!-- Menu/item attributes -->
<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>
<item name="android:itemBackground">@android:drawable/menu_selector</item>
<item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>
<item name="android:horizontalDivider">@android:drawable/divider_horizontal_bright</item>
<item name="android:verticalDivider">@android:drawable/divider_vertical_bright</item>
<item name="android:windowAnimationStyle">@android:style/Animation.OptionsPanel</item>
<item name="android:moreIcon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
</style>

Yani, menüdeki metnin görünümü @android:style/TextAppearance.Widget.IconMenu.Item
Şimdi, stillerin tanımındadır :

<style name="TextAppearance.Widget.IconMenu.Item" parent="TextAppearance.Small">
<item name="android:textColor">?textColorPrimaryInverse</item>
</style>

Sistemin kaynaklarının renk klasörüne bakarsanız, şimdi söz konusu rengin adına sahibiz:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@android:color/bright_foreground_light_disabled" /> 
<item android:state_window_focused="false" android:color="@android:color/bright_foreground_light" /> 
<item android:state_pressed="true" android:color="@android:color/bright_foreground_light" /> 
<item android:state_selected="true" android:color="@android:color/bright_foreground_light" /> 
<item android:color="@android:color/bright_foreground_light" /> 
<!--  not selected --> 
</selector>

Son olarak, yapmanız gerekenler:

"TextAppearance.Widget.IconMenu.Item" seçeneğini geçersiz kılın ve kendi stilinizi oluşturun. Ardından istediğiniz şekilde yapmak için kendi seçicinize bağlayın. Umarım bu size yardımcı olur. İyi şanslar!


Cevabınız için teşekkürler. Ne önerdiğini yaptım ama menü öğesinin rengini değiştirmiyor
sunil

Aslında, düşündüğümden çok daha karmaşık olan menü öğelerini daha fazla okuyarak fark ettim.Tam özel menünüzü oluşturmak istemiyorsanız ... Bunun benim için biraz daha okumaya ihtiyacı olacak, tutacağım Daha fazlasını bulursam buraya gönderdin.
Sephy

"TextAppearance.Widget.IconMenu.Item" geçersiz kılınamaz.
peceps

Bu cevap yanıltıcıdır .. yani sonuç, işe yaramaz ve aslında düşünüldüğünden çok daha zor / uzun bir sargı mıdır?
speedynomads

6

Android'deki seçenekler menüsü arka planı ayarlamak veya metin görünümünü değiştirmek için özelleştirilebilir. Menüdeki arka plan ve metin rengi temalar ve stiller kullanılarak değiştirilemedi. Android kaynak kodu (data \ res \ layout \ icon_menu_item_layout.xml) menü düzeni için özel bir “com.android.internal.view.menu.IconMenuItem” Görünümü sınıf öğesi kullanır. Menüyü özelleştirmek için yukarıdaki sınıfta değişiklikler yapabiliriz. Aynı şeyi elde etmek için LayoutInflater fabrika sınıfını kullanın ve görünüm için arka plan ve metin rengini ayarlayın.


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu);
    getLayoutInflater().setFactory(new Factory() {
        @Override
        public View onCreateView(String name, Context context, AttributeSet attrs) {
            if (name .equalsIgnoreCase(“com.android.internal.view.menu.IconMenuItemView”)) {
                try{
                    LayoutInflater f = getLayoutInflater();
                    final View view = f.createView(name, null, attrs);
                    new Handler().post(new Runnable() {
                        public void run() {
                            // set the background drawable
                            view .setBackgroundResource(R.drawable.my_ac_menu_background);

                            // set the text color
                            ((TextView) view).setTextColor(Color.WHITE);
                        }
                    });
                    return view;
                } catch (InflateException e) {
                    } catch (ClassNotFoundException e) {}
            }
            return null;
        }
    });
    return super.onCreateOptionsMenu(menu);
}



3
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Kra

Bu ilk kez çalışıyor. Menüyü ikinci kez açtığınızda istisna alırsınız.
LoveForDroid

6

Kod örneği için teşekkürler. Bir bağlam menüsü ile çalışmak için gitmek gitmek değiştirmek zorunda kaldı. Bu benim çözümüm.

    static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class};

class MenuColorFix implements LayoutInflater.Factory {
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) {
            try {
                Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class);
                Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature);
                final ViewGroup view = constructor.newInstance(new Object[]{context,attrs});

                new Handler().post(new Runnable() {
                    public void run() {
                        try {
                            view.setBackgroundColor(Color.BLACK);
                            List<View> children = getAllChildren(view);
                            for(int i = 0; i< children.size(); i++) {
                                View child = children.get(i);
                                if ( child instanceof TextView ) {
                                    ((TextView)child).setTextColor(Color.WHITE);
                                }
                            }
                        }
                        catch (Exception e) {
                            Log.i(TAG, "Caught Exception!",e);
                        }

                    }
                });
                return view;
            }
            catch (Exception e) {
                Log.i(TAG, "Caught Exception!",e);
            }
        }
        return null;
    }       
}

public List<View> getAllChildren(ViewGroup vg) {
    ArrayList<View> result = new ArrayList<View>();
    for ( int i = 0; i < vg.getChildCount(); i++ ) {
        View child = vg.getChildAt(i);
        if ( child instanceof ViewGroup) {
            result.addAll(getAllChildren((ViewGroup)child));
        }
        else {
            result.add(child);
        }
    }
    return result;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    LayoutInflater lInflater = getLayoutInflater();
    if ( lInflater.getFactory() == null ) {
        lInflater.setFactory(new MenuColorFix());
    }
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.myMenu, menu);
}

Benim için bu Android 1.6, 2.03 ve 4.03 ile çalışıyor.


Yukarıdakileri yapıyorsanız, sadece Marcus Wolschon çözümünü kullanmaya bakmalısınız. Çok daha basit.
chubbsondubs

Xml çözümü, örneğin 2.3.x'te benim için çalışmıyor, ancak bu bir çekicilik gibi çalışıyor - ayrıca 4.x
sunlock 5:12

Bu çözüm en iyi sonucu verdi. Ayrıca uyumluluk kütüphanesi
Chiatar

Bu düzeltme Google Maps v2 ile çalışmaz - haritaların doğru bir şekilde oluşturulması için süper yöntemin 1. olarak adlandırılması gerekir.
Chiatar

5

buldum Eureka !!

uygulama temanızda:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/ActionBarTheme</item>
    <!-- backward compatibility -->          
    <item name="actionBarStyle">@style/ActionBarTheme</item>        
</style>

işlem çubuğu temanız:

<style name="ActionBarTheme" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
   <item name="android:background">@color/actionbar_bg_color</item>
   <item name="popupTheme">@style/ActionBarPopupTheme</item
   <!-- backward compatibility -->
   <item name="background">@color/actionbar_bg_color</item>
</style>

ve işte pop-up temanız:

 <style name="ActionBarPopupTheme">
    <item name="android:textColor">@color/menu_text_color</item>
    <item name="android:background">@color/menu_bg_color</item>
 </style>

Şerefe;)


5

menü öğesinin metin rengini değiştirmek için aşağıdaki kodu kullanın

<style name="AppToolbar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/menu_item_color</item>
</style>

nerede

<style name="menu_item_color">
<item name="android:textColor">@color/app_font_color</item>
</style>

4

Maks. Usta sayesinde, bu seviye 22'de çalışmam gereken çözüm:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setSubmitButtonEnabled(true);
    searchView.setOnQueryTextListener(this);
    setMenuTextColor(menu, R.id.displaySummary, R.string.show_summary);
    setMenuTextColor(menu, R.id.about, R.string.text_about);
    setMenuTextColor(menu, R.id.importExport, R.string.import_export);
    setMenuTextColor(menu, R.id.preferences, R.string.settings);
    return true;
}

private void setMenuTextColor(Menu menu, int menuResource, int menuTextResource) {
    MenuItem item = menu.findItem(menuResource);
    SpannableString s = new SpannableString(getString(menuTextResource));
    s.setSpan(new ForegroundColorSpan(Color.BLACK), 0, s.length(), 0);
    item.setTitle(s);
}

Sabit kodlanmış yöntem Color.BLACKiçin ek bir parametre olabilir setMenuTextColor. Ayrıca, ben sadece olan menü öğeleri için kullanılır android:showAsAction="never".


API 24'te benim için çalışmıyor. Herhangi bir fikir var mı? Bu günlerce takılıp ... saçma!
David P

Size ne söyleyeceğinden emin değilim. API 25'te benim için iyi çalışıyor.
lightkeeper

3

Renkleri programlı olarak ayarlayabilirsiniz.

private static void setMenuTextColor(final Context context, final Toolbar toolbar, final int menuResId, final int colorRes) {
    toolbar.post(new Runnable() {
        @Override
        public void run() {
            View settingsMenuItem =  toolbar.findViewById(menuResId);
            if (settingsMenuItem instanceof TextView) {
                if (DEBUG) {
                    Log.i(TAG, "setMenuTextColor textview");
                }
                TextView tv = (TextView) settingsMenuItem;
                tv.setTextColor(ContextCompat.getColor(context, colorRes));
            } else { // you can ignore this branch, because usually there is not the situation
                Menu menu = toolbar.getMenu();
                MenuItem item = menu.findItem(menuResId);
                SpannableString s = new SpannableString(item.getTitle());
                s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, s.length(), 0);
                item.setTitle(s);
            }

        }
    });
}

3

Bunu styles.xml dosyasına eklemek benim için çalıştı

<item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item>

2

Bunu temanıza eklemeniz yeterli

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:itemTextAppearance">@style/AppTheme.ItemTextStyle</item>
</style>

<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@color/orange_500</item>
</style>

API 21'de test edildi


2
Kullanmak daha iyidir <style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">, aksi takdirde metin taşma menüsünde çok küçük görünür. Ayrıca bu tekniğin yalnızca Android 5 ve üstü sürümlerde çalıştığını unutmayın.
Mr-IDE

2
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search, menu);


    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    SearchView searchView = (SearchView) myActionMenuItem.getActionView();

    EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchEditText.setTextColor(Color.WHITE); //You color here

1
Cevabınızı açıklayın
Coder

1
Ya bir SearchView değilse?
Nasch

2

Durumum, seçenekler menüsündeki ayarlar metin rengiydi (ana uygulama menüsü menü düğmesine basıldığında gösterdi).

API 16'da test edildi ile AppCompat-v7-27.0.2 kütüphane, AppCompatActivityiçin MainActivityve AppCompatde uygulama için tema AndroidManifest.xml .

styles.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="actionBarPopupTheme">@style/PopupTheme</item>
</style>

<style name="PopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
  <item name="android:textColorSecondary">#f00</item>
</style>

Eğer bilmiyorum textColorSecondary diğer öğeleri etkileyip etkilemediğini ancak menü metni rengini kontrol ediyor.


Konuyla ilgili bazı örnekler aradım, ancak kullanıma hazır tüm snippet'ler çalışmadı.

Bu yüzden appcompat-v7 için kaynak kodu ile araştırmak istedim kütüphanesi (özellikle .aar paketinin res klasörü ile) .

Benim durumumda Eclipse'yi patlamış .aar ile kullandım bağımlılıklarıyla kullandım. Böylece varsayılan stilleri değiştirebilir ve sonuçları kontrol edebilirim. Doğrudan Gradle veya Android Studio ile kullanmak için kitaplıkları nasıl patlatacağınızı bilmiyorum . Başka bir araştırmayı hak ediyor.

Amacım menü metni için res / değerleri / değerleri.xml dosyasında hangi rengin kullanıldığını bulmaktı .

  1. Bu dosyayı açtım, sonra tüm renkleri çoğalttım, onları geçersiz kılmak için varsayılanların altına koydum ve #f00hepsine değer atadım.
  2. Uygulamayı başlatın.
  3. Birçok öğenin kırmızı arka plan veya metin rengi vardı. Ve menü öğeleri de. İhtiyacım olan buydu.
  4. Eklediğim renkleri 5-10 satırlık bloklarla kaldırma secondary_text_default_material_light renk öğesiyle bitirdim.
  5. Res klasöründeki (veya res / colors içindeki daha iyi) dosyalarda bu adı arama / abc_seincil_text_material_light.xml renginde yalnızca bir tane buldum dosyasında (bu işlemler için Sublime Text kullandım, böylece ihtiyacım olan şeyi bulmak daha kolay).
  6. Değerlere geri dön .xml için 8 kullanım bulundu@color/abc_secondary_text_material_light .
  7. Bu, bir Light temasıydı ve 2 temada 4 kaldı: Base.ThemeOverlay.AppCompat.Lightve Platform.AppCompat.Light.
  8. Birinci tema ikincisinin bir çocuktum böylece renk kaynakla sadece 2 nitelikleri vardı: android:textColorSecondaryve android:textColorTertiaryiçinde Base.ThemeOverlay.AppCompat.Light.
  9. Doğrudan değerlerini değiştirme values.xml uygulamasını ve koşma Final Doğru nitelik olduğunu tespit android:textColorSecondary.
  10. Sonra bir tema ya da başka bir özniteliğe ihtiyacım vardı, bu yüzden onu uygulamamın style.xml'sinde değiştirebilirim (çünkü temamın üst öğesiTheme.AppCompat.Light değil, olduğu gibi ThemeOverlay.AppCompat.Light).
  11. Aynı dosyada Base.ThemeOverlay.AppCompat.Light. Bir çocuğu vardı ThemeOverlay.AppCompat.Light.
  12. Arandığımda temayı ThemeOverlay.AppCompat.Lightkullanımında özellik değeri Base.Theme.AppCompat.Light.DarkActionBarolarak buldum actionBarPopupTheme.
  13. Uygulamamın teması Theme.AppCompat.Light.DarkActionBar, stilin.xml dosyasındaBase.Theme.AppCompat.Light.DarkActionBar bu özelliği sorunsuz bir şekilde kullanabilmem için bulunan bir çocuktu .
  14. Yukarıdaki örnek kodda görüldüğü gibi, bahsedilen bir alt tema oluşturdum ThemeOverlay.AppCompat.Lightve android:textColorSecondaryözniteliği değiştirdim .

https://i.imgur.com/LNfKdzC.png


1

Sephy'nin çözümü çalışmıyor. Yukarıda açıklanan yöntemi kullanarak seçenekler menüsü öğesinin metin görünümünü geçersiz kılmak mümkündür, ancak öğeyi veya menüyü değil. Bunu yapmak için esasen 3 yol vardır:

  1. Seçenekler menüsünün arka plan rengi nasıl değiştirilir?
  2. İstediğiniz sonuçları almak için onCreateOptionsMenu ve onPrepareOptionsMenu öğelerini görüntülemek ve geçersiz kılmak için kendi görünümünüzü yazın. Bunu genel olarak belirtiyorum çünkü bu yöntemlerde genellikle istediğinizi yapabilirsiniz, ancak muhtemelen super () işlevini çağırmak istemezsiniz.
  3. Açık kaynaklı SDK'dan kodu kopyalayın ve davranışınız için özelleştirin. Etkinlik tarafından kullanılan varsayılan menü uygulaması artık geçerli olmayacak.

Daha fazla ipucu için Sayı 4441: Özel Seçenekler Menüsü Teması'na bakın .


Tekrarlamak için ... Sephy'nin çözümü TextAppearance menü öğesi için çalışıyor, ancak yaptığım şey bir themes.xml aracılığıyla varsayılanı geçersiz kılmak. Ayrıca, yukarıdaki # 2 veya # 3, super # onCreateOptionsMenu / super # onPrepareOptionsMenu'ya çağrı yapmanın, sistem menüsü öğelerini ... #CreateOptionsMenu () için javadoc'ta belirtildiği gibi yerleştirmek üzere tasarlandığının farkında olmalıdır. Bu, uygulamanız için önemli olabilir / olmayabilir.
İnatçı

Sephy'nin tanımladığı şey bunu themes.xml dosyasında bulundurmaktır: <item name = "android: itemTextAppearance"> @ style / Text_MenuItemText </item> Sonra stillerinizde böyle bir şey tanımlayın. Xml: <style name = "Text_MenuItemText" > <item name = "android: textSize"> 12dp </item> <item name = "android: textColor"> # FFFFFF </item> </style> Bu kadar kolay. Demek istediğin bu muydu? Daha derin seçenekler menüsü özelleştirme hiç de kolay değil, ancak yakında bir blog makalesi yayınlamayı düşünüyorum.
Tenacious

1

bu kodu deneyin ....

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.my_menu, menu);

        getLayoutInflater().setFactory(new Factory() {
            @Override
            public View onCreateView(String name, Context context,
                    AttributeSet attrs) {

                if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
                    try {
                        LayoutInflater f = getLayoutInflater();
                        final View view = f.createView(name, null, attrs);

                        new Handler().post(new Runnable() {
                            public void run() {

                                // set the background drawable
                                 view.setBackgroundResource(R.drawable.my_ac_menu_background);

                                // set the text color
                                ((TextView) view).setTextColor(Color.WHITE);
                            }
                        });
                        return view;
                    } catch (InflateException e) {
                    } catch (ClassNotFoundException e) {
                    }
                }
                return null;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

1
Android'de> 4.0 alıyorumjava.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Kra

1

Tek bir menü öğesi için renk ayarlamak istiyorsanız, bir araç çubuğu temasını özelleştirmek doğru çözüm değildir. Bunu başarmak için android: actionLayout ve menü öğesi için bir eylem görünümü kullanabilirsiniz.

Önce eylem görünümü için bir XML düzen dosyası oluşturun. Bu örnekte, eylem görünümü olarak bir düğme kullanıyoruz:

menu_button.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/menuButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Done"
        android:textColor="?android:attr/colorAccent"
        style="?android:attr/buttonBarButtonStyle"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Yukarıdaki kod snippet'inde android:textColor="?android:attr/colorAccent"düğme metni rengini özelleştirmek için kullanıyoruz .

Ardından, menü için XML düzen dosyanıza app:actionLayout="@layout/menu_button"aşağıda gösterildiği gibi ekleyin :

main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/menuItem"
        android:title=""
        app:actionLayout="@layout/menu_button"
        app:showAsAction="always"/>
</menu>

Son olarak onCreateOptionsMenu()etkinliğinizdeki yöntemi geçersiz kılın :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.menuItem);
    Button saveButton = item.getActionView().findViewById(R.id.menuButton);
    saveButton.setOnClickListener(view -> {
        // Do something
    });
    return true;
}

... veya fragman:

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater){
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.menuItem);
    Button saveButton = item.getActionView().findViewById(R.id.menuButton);
    button.setOnClickListener(view -> {
        // Do something
    });
}

İşlem görünümleri hakkında daha fazla bilgi için Android geliştirici kılavuzuna bakın .


0

Belirli bir menü öğesini renkle nasıl renklendirebilirsiniz, tüm API düzeyleri için çalışır:

public static void setToolbarMenuItemTextColor(final Toolbar toolbar,
                                               final @ColorRes int color,
                                               @IdRes final int resId) {
    if (toolbar != null) {
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            final View view = toolbar.getChildAt(i);
            if (view instanceof ActionMenuView) {
                final ActionMenuView actionMenuView = (ActionMenuView) view;
                // view children are accessible only after layout-ing
                actionMenuView.post(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < actionMenuView.getChildCount(); j++) {
                            final View innerView = actionMenuView.getChildAt(j);
                            if (innerView instanceof ActionMenuItemView) {
                                final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
                                if (resId == itemView.getId()) {
                                    itemView.setTextColor(ContextCompat.getColor(toolbar.getContext(), color));
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

Bunu yaparak arka plan seçici efektini kaybedersiniz, işte tüm menü öğesi alt öğelerine özel bir arka plan seçici uygulamak için kod.

public static void setToolbarMenuItemsBackgroundSelector(final Context context,
                                                         final Toolbar toolbar) {
    if (toolbar != null) {
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            final View view = toolbar.getChildAt(i);
            if (view instanceof ImageButton) {
                // left toolbar icon (navigation, hamburger, ...)
                UiHelper.setViewBackgroundSelector(context, view);
            } else if (view instanceof ActionMenuView) {
                final ActionMenuView actionMenuView = (ActionMenuView) view;

                // view children are accessible only after layout-ing
                actionMenuView.post(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < actionMenuView.getChildCount(); j++) {
                            final View innerView = actionMenuView.getChildAt(j);
                            if (innerView instanceof ActionMenuItemView) {
                                // text item views
                                final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
                                UiHelper.setViewBackgroundSelector(context, itemView);

                                // icon item views
                                for (int k = 0; k < itemView.getCompoundDrawables().length; k++) {
                                    if (itemView.getCompoundDrawables()[k] != null) {
                                        UiHelper.setViewBackgroundSelector(context, itemView);
                                    }
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

İşte yardımcı fonksiyon:

public static void setViewBackgroundSelector(@NonNull Context context, @NonNull View itemView) {
    int[] attrs = new int[]{R.attr.selectableItemBackgroundBorderless};
    TypedArray ta = context.obtainStyledAttributes(attrs);
    Drawable drawable = ta.getDrawable(0);
    ta.recycle();

    ViewCompat.setBackground(itemView, drawable);
}

0

Metin rengini değiştirmek için, MenuItem için özel bir görünüm ayarlayabilir ve ardından metnin rengini tanımlayabilirsiniz.

Örnek Kod: MenuItem.setActionView ()


Bu kod snippet'i soruyu çözebilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Mischa
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.