2014-11-16 12 views
7

voglio cambiare il carattere predefinito di PopupMenu oggetti e utilizzare dal mio carattere personalizzato per loro.articoli Come cambiare tipo di carattere PopUpMenu

Questo è il codice che ho usato per la creazione di PopupMenu:

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

e il menu Oggetti:

<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> 

sarò così grato se si condivide i vostri suggerimenti con me: -)

Saluti

risposta

0

Penso che non sia possibile. In realtà puoi usare popupWindow e personalizzarlo come vuoi.

2

è possibile utilizzare la riflessione. Può essere utilizzato per qualsiasi personalizzazione delle voci di menu popup. Il layout delle risorse della voce di menu nel supporto Android è definito in android.support.v7.internal.view.menu.MenuPopupHelper e il suo nome di campo è "ITEM_LAYOUT" dichiarato come finale statico; Il suo valore è uguale a "R.layout.abc_popup_menu_item_layout" Trovo il file di layout in Grepcode e lo copio nella directory di layout del mio progetto. L'ho chiamato popup_menu_item_layout.xml. La mia comparsa Layout voce di menu viene qui

<?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. --> 

Poi creare classe personalizzata 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); 
    } 
} 
} 

Infine sostituire risorsa di layout id per le voci di menu per riflessione; alcuni dove come nella vostra attività onCreate metodo principale o nella vostra applicazione metodo 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); 
} 
4

leggi la mia soluzione per lo stesso problema:

menu a comparsa Mehthod:

private void showEditPopupWindow(Context mContext) { 
     PopupMenu popupMenu = new PopupMenu(mContext, view); 
     popupMenu.getMenuInflater().inflate(R.menu.YOUR_MENU, popupMenu.getMenu()); 
     popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       if (item.getItemId() == R.id.delete) { 
        // Do your stuffs; 
       } else { 
        // Do your stuffs 
       } 
       return true; 
      } 
     }); 

     Menu menu = popupMenu.getMenu(); 
     for (int i = 0; i < menu.size(); i++) { 
      MenuItem mi = menu.getItem(i); 
      applyFontToMenuItem(mi); 
     } 

    } 

Applica il tuo carattere in questo metodo, inoltre è possibile cambiare il colore del carattere:

private void applyFontToMenuItem(MenuItem mi) { 
     Typeface font = Typeface.createFromAsset(mContext.getAssets(), "fonts/YOUR_FONT.ttf"); 
     SpannableString mNewTitle = new SpannableString(mi.getTitle()); 
     mNewTitle.setSpan(new CustomTypeFaceSpan("", font,Color.WHITE), 0, mNewTitle.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
     mi.setTitle(mNewTitle); 
    } 

CustomTypeFaceSpan Classe :

public class CustomTypeFaceSpan extends TypefaceSpan { 

private final Typeface newType; 
private final int mColor; 

public CustomTypeFaceSpan(String family, Typeface type, @ColorInt int color) { 

    super(family); 
    newType = type; 
    mColor = color; 
} 

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

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

@Override 
public int getSpanTypeId() { 
    return super.getSpanTypeId(); 
} 

@ColorInt 
public int getForegroundColor() { 
    return mColor; 
} 




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); 
} 

}

Problemi correlati