2012-07-19 2 views
3

내 질문에 많은 설명이 필요하다고 생각하지 않는다. 단지 컨텍스트 메뉴 항목의 글꼴과 크기를 변경해야한다. 어떻게해야합니까? 이것은 내가 안드로이드에 대한 기본의 ContextMenu를 얻는 방법이다Android ContextMenu의 글꼴을 변경하려면 어떻게해야합니까?

@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.listmenu, menu); 

    } 

:

여기 내 코드입니다. 하지만 그것을 사용자 정의하고 싶습니다.

+1

가 어떻게 상황에 맞는 메뉴를 만드는처럼 작동 ? – FoamyGuy

답변

2

R.menu.listmenu 대신 inflate 할 레이아웃을 직접 만든 다음 그 위에 사용자 정의 글꼴을 설정할 수 있습니까?

다른 방법으로 사용자 터치를 차단하고 전체 사용자 정의 메뉴를 팝업 할 수는 있지만 특정 글꼴/메뉴를 예상하는 사용자에게는 불편할 수 있습니다.

2

노력이

@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

이렇게하면 onCreateContextMenu에도 적용됩니까? – Wise

+0

일 수 있습니다 .. 시도해보십시오. –

0

이 테스트 매력 :

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

    for (int i = 0; i < menu.size(); i++) { 
     MenuItem mi = menu.getItem(i); 
     //for aapplying a font to subMenu ... 
     SubMenu subMenu = mi.getSubMenu(); 
     if (subMenu != null && subMenu.size() > 0) { 
      for (int j = 0; j < subMenu.size(); j++) { 
       MenuItem subMenuItem = subMenu.getItem(j); 
       applyFontToMenuItem(subMenuItem, typeface); 
      } 
     } 
     //the method we have create in activity 
     applyFontToMenuItem(mi, typeface); 
    } 

    return super.onCreateOptionsMenu(menu); 
} 



private void applyFontToMenuItem(MenuItem mi, Typeface font) { 
    SpannableString mNewTitle = new SpannableString(mi.getTitle()); 
    mNewTitle.setSpan(new CustomTypefaceSpan("", font), 0, mNewTitle.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
    mi.setTitle(mNewTitle); 
} 

사용자 정의 스팬 클래스

import android.graphics.Paint; 
import android.graphics.Typeface; 
import android.text.TextPaint; 
import android.text.style.TypefaceSpan; 

public class CustomTypefaceSpan extends TypefaceSpan { 

    private final Typeface newType; 

    public CustomTypefaceSpan(String family, Typeface type) { 
     super(family); 
     newType = type; 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     applyCustomTypeFace(ds, newType); 
    } 

    @Override 
    public void updateMeasureState(TextPaint paint) { 
     applyCustomTypeFace(paint, newType); 
    } 

    private static void applyCustomTypeFace(Paint paint, Typeface tf) { 
     int oldStyle; 
     Typeface old = paint.getTypeface(); 
     if (old == null) { 
      oldStyle = 0; 
     } else { 
      oldStyle = old.getStyle(); 
     } 

     int fake = oldStyle & ~tf.getStyle(); 
     if ((fake & Typeface.BOLD) != 0) { 
      paint.setFakeBoldText(true); 
     } 

     if ((fake & Typeface.ITALIC) != 0) { 
      paint.setTextSkewX(-0.25f); 
     } 

     paint.setTypeface(tf); 
    } 
} 
관련 문제