使用 Java 代码更改自定义 SubMenu 背景颜色

Posted

技术标签:

【中文标题】使用 Java 代码更改自定义 SubMenu 背景颜色【英文标题】:Change custom SubMenu background color with Java code 【发布时间】:2016-12-26 18:16:20 【问题描述】:

在我的家庭活动中,我有一个带有自定义 溢出菜单 的工具栏,我希望它改变颜色以符合工具栏背景颜色(导致工具栏背景颜色可以更改(用户更改为自己喜欢的颜色))...我不知道该怎么做:

这是我的overflow_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/overflow_save_current" app:showAsAction="always" android:title="@string/overflow_save_current" android:icon="@drawable/ic_action_save_light" />
<item android:id="@+id/overflow_settings" app:showAsAction="always" android:title="@string/overflow_settings" android:icon="@drawable/ic_action_settings_light" />
<item android:id="@+id/overflow_overflow" app:showAsAction="always" android:icon="@drawable/ic_action_overflow_light">
    <menu>
        <item android:id="@+id/overflow_feed_back" app:showAsAction="never|withText" android:title="@string/overflow_feed_back" android:icon="@drawable/ic_action_send_now_light" />
        <item android:id="@+id/overflow_about_us" app:showAsAction="never|withText" android:title="@string/overflow_about_us" android:icon="@drawable/ic_action_about_light" />
        <item android:id="@+id/overflow_exit" app:showAsAction="never|withText" android:title="@string/overflow_exit" android:icon="@drawable/ic_action_forward_light" />
    </menu>
</item>

这是OnPrepareOptionsMenu() 方法:

@Override
public boolean onPrepareOptionsMenu(Menu menu) 
    /* Resources res = getResources();
    item = menu.findItem(R.id.overflow_feed_back);
    SpannableStringBuilder builder = new SpannableStringBuilder("* " + res.getString(R.string.overflow_feed_back));
    builder.setSpan(new ImageSpan(this, android.R.drawable.ic_menu_send), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    item.setTitle(builder); */
    if (!Common.compatible(Common.color, 0xFF000000)) 
        menu.findItem(R.id.overflow_save_current).setIcon(R.drawable.ic_action_save_dark);
        menu.findItem(R.id.overflow_settings).setIcon(R.drawable.ic_action_settings_dark);
        menu.findItem(R.id.overflow_overflow).setIcon(R.drawable.ic_action_overflow_dark);
     else 
        menu.findItem(R.id.overflow_save_current).setIcon(R.drawable.ic_action_save_light);
        menu.findItem(R.id.overflow_settings).setIcon(R.drawable.ic_action_settings_light);
        menu.findItem(R.id.overflow_overflow).setIcon(R.drawable.ic_action_overflow_light);
    
    return super.onPrepareOptionsMenu(menu);

我已经尝试更改每个元素的背景颜色...但我每次都得到 NPE,menu.findItem(R.id.overflow_about_us).getActionView().setBackgroundColor(Color.BLUE);

希望你能为我找到解决方案,Darkball60

【问题讨论】:

【参考方案1】:

所以......没有人帮助我......所以我不得不独自工作......几个小时......最终找到解决方案:

@Override
public View onCreateView(String name, Context context, AttributeSet attrs)  
    // Do you own inflater stuff here 
    // Check for menu items (Options menu AKA menu key) 
    if (name.equalsIgnoreCase("android.support.v7.view.menu.ListMenuItemView")) 
        try  
            // Ask our inflater to create the view 
            final View view = LayoutInflater.from(context).createView(name, null, attrs); 
            // Kind of apply our own background 
            new Handler().post(new Runnable() 
                public void run() 
                    if (!Common.compatible(Common.color, 0xFF000000)) 
                        try 
                            ((TextView)((RelativeLayout)((ListMenuItemView)view).getChildAt(1)).getChildAt(0)).setTextColor(0xFFFFFFFF);
                         catch (ClassCastException e) 

                        
                     else 
                        try 
                            ((TextView)((RelativeLayout)((ListMenuItemView)view).getChildAt(1)).getChildAt(0)).setTextColor(0xFF000000);
                         catch (ClassCastException e) 

                        
                    
                    view.setBackgroundColor(Common.color);
                
            );
            return view;
         catch (InflateException e) 

         catch (ClassNotFoundException e) 

        
    
    return null; 

如果背景是暗的……那么 textColor 是白色的……如果背景是浅的,那么 textColor 是黑色的。

下面是两个不同工具栏颜色的屏幕:

希望它对我以外的其他人有所帮助,Darkball60(如果你喜欢这个答案......请随意投票:))

【讨论】:

没问题。实际上很难弄清楚如何直接在 Java 中做到这一点以便能够动态更改它

以上是关于使用 Java 代码更改自定义 SubMenu 背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

Steam优化Xbox手柄体验 支持绑定背键及分享键自定义设置

如何更改 Android 菜单项的自定义字体?

禁用Wordpress中的主题更改

从android中的片段更改自定义ActionBar标题

springboot中怎么自定义thymeleaf标签

为啥 Wordpress 自定义 HTML 块正在更改我的代码?