Android 修改Menu字體顏色和背景


    我們知道,在Android中修改TextView的字體顏色,一般是通過setTextColor()方法。雖說Android的Menu菜單項的每一項都是由TextView組成,但是Android的sdk並沒有給出具體設置Menu的顏色的api。一般我們只能通過修改Theme來間接修改Menu的樣式,但如果需要對單獨的某一個Menu修改顏色,這種方法又不行了。

    stackoverflow上提出了另外一種方法,即LayoutInflater.Factory,當你通過LayoutInflater去創建一個view或menu時,你就可以通過實現自己的LayoutInflater.Factory來定制自己的View。相關代碼如下:

getLayoutInflater().setFactory(new android.view.LayoutInflater.Factory(){

              @Override
              public View onCreateView(String name, Context context, AttributeSet attrs) {
                  if (name.equalsIgnoreCase("com.android.internal.view.menu.ActionMenuItemView")) {
                     try{
                         LayoutInflater f = LayoutInflater.from(context);
                         final View view = f.createView(name, null, attrs);
                         if(view instanceof TextView) {
                             TextView menuTv = ((TextView)view);
                             //這里你就可以修改TextView的字體顏色,大小,背景等等.
                             menuTv.setTextColor(getResources().getColor(R.color.action_bar_button_text_color));
                         }
                         return view;
                      }catch (InflateException e) {
                         e.printStackTrace();
                      }catch (ClassNotFoundException e) {
                         e.printStackTrace();
                      }
                  }
                  return null;
              }
            });


     其實,還有另外一種方法。我們知道修改Menu的標題是通過       

 public MenuItem setTitle(CharSequence title);

     這里,介紹一個類SpannableString給大家,如果你做個聊天的表情相關的應用,那么你一定對這個類很熟悉,首先

我們來看下這個類的聲明:

public class SpannableString extends SpannableStringInternal implements CharSequence, GetChars, Spannable

     可以清楚的看到SpannableString是實現了CharSequence接口的,所以我們可以通過構建一個SpannableString來

間接的修改Menu的字體和顏色。這里我們使用了SpannableStringBuilder,相關代碼如下:

 
        
 
        
        /*
         * Add color to a given text
         */
        private SpannableStringBuilder addColor(CharSequence text, int color) {
            SpannableStringBuilder builder = new SpannableStringBuilder(text);
            if (color != 0) {
                builder.setSpan(new ForegroundColorSpan(color), 0, text.length(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            return builder;
        }
 
        

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM