Как изменить шрифт PopupMenu

Я хочу изменить шрифт по умолчанию для элементов PopupMenu и использовать для них свой собственный шрифт.

Это код, который я использовал для создания PopupMenu :

PopupMenu pm = new PopupMenu(this, v); getMenuInflater().inflate(R.menu.main, pm.getMenu()); pm.show(); 

И пункты меню:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/Setting" android:title="Setting"/> <item android:id="@+id/About" android:title="About"/> <item android:id="@+id/Help" android:title="Help"/> </menu> 

Я буду так благодарен, если вы поделитесь своими предложениями со мной 🙂

С уважением

Вы можете использовать отражение. Он может использоваться для любой настройки пунктов всплывающего меню. Макет ресурса элемента меню в поддержке android определен в файле android.support.v7.internal.view.menu.MenuPopupHelper, и это имя поля «ITEM_LAYOUT», объявленное как статическое окончание; Это значение равно «R.layout.abc_popup_menu_item_layout». Я нахожу файл макета в Grepcode и копирую его в каталог макета проекта. Я назвал его popup_menu_item_layout.xml. Здесь отображается макет пункта всплывающего меню

 <?xml version="1.0" encoding="utf-8"?> <mypackage.PopupMenuItemView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?attr/dropdownListPreferredItemHeight" android:minWidth="196dip" android:paddingRight="16dip"> <!-- Icon will be inserted here. --> <!-- The title and summary have some gap between them, and this 'group' should be centered vertically. --> <RelativeLayout android:layout_width="0dip" android:layout_weight="1" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="16dip" android:duplicateParentState="true"> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:textAppearance="?attr/textAppearanceLargePopupMenu" android:singleLine="true" android:duplicateParentState="true" android:ellipsize="marquee" android:fadingEdge="horizontal"/> <TextView android:id="@+id/shortcut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/title" android:layout_alignParentLeft="true" android:textAppearance="?attr/textAppearanceSmallPopupMenu" android:singleLine="true" android:duplicateParentState="true"/> </RelativeLayout> <!-- Checkbox, and/or radio button will be inserted here. --> 

Затем создайте пользовательский класс PopupMenuItemView:

 public class PopupMenuItemView extends android.support.v7.internal.view.menu.ListMenuItemView { public PopupMenuItemView(Context context, AttributeSet attrs) { super(context, attrs); } public PopupMenuItemView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onFinishInflate() { super.onFinishInflate(); applyTypefaceToAll(this, your_typeface); TypefaceUtils.applyTextSizeToAll(this, your_textsize); } public static void applyTypefaceToAll(View view, Typeface typeface) { if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++) applyTypefaceToAll(viewGroup.getChildAt(childIndex), typeface); } else if (view instanceof TextView) { TextView textView = (TextView) view; textView.setTypeface(typeface); textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); } } public static void applyTextSizeToAll(View view, float size) { if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++) applyTextSizeToAll(viewGroup.getChildAt(childIndex), size); } else if (view instanceof TextView) { TextView textView = (TextView) view; textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); } } } 

Наконец, замените идентификатор ресурса макета для пунктов меню путем отражения; Некоторые, где, как в вашем основном действии onCreate метод или в вашем приложении onCreate метод:

  try { setFinalStatic(MenuPopupHelper.class.getDeclaredField("ITEM_LAYOUT"), R.layout.popup_menu_item_layout); } catch (Exception e) { e.printStackTrace(); } public static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); try { Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); }catch (Exception e) { e.printStackTrace(); } field.set(null, newValue); } 

Я думаю, что это невозможно. Фактически вы можете использовать popupWindow и настраивать его как меню по своему усмотрению.