Как применить пользовательский шрифт к элементам меню навигационной панели? - PullRequest
0 голосов
/ 19 февраля 2020

Я уже пробовал решение, указанное в { ссылка }, но все равно оно не оказывает никакого влияния на предметы. Моей targetSdkVersion является 29. Может кто-нибудь мне помочь?

Что я сделал это:

в основной деятельности:

у меня есть метод:

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

я вызвал это внутри onCreateView: "

    Menu m = navigationView.getMenu();
    for (int i=0;i<m.size();i++) {
        MenuItem mi = m.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);
            }
        }

        //the method we have create in activity
        applyFontToMenuItem(mi);
    }

Я создал пользовательский класс:

CustomTypefaceSpan:

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

Все еще не применяется к пунктам меню. Любая помощь будет очень полезна.

PS: На самом деле мы запускаем Приложив приложение, быстро посмотрев в навигационную панель, мы увидим, что шрифт установлен, но через несколько миллисекунд он возвращается к шрифту по умолчанию. Не знаю, почему это происходит.

...