2016-01-05 3 views
7

Я хочу использовать свой собственный шрифт для навигационного ящика в android.I использовать библиотеку поставляется с Android-студией в соответствии с этим ответом: https://stackoverflow.com/a/23632492/4393226. Но я не знаю, как изменить шрифт и сделать его RTL. Я много искал, и я нашел, как сделать ящик RTL. Я использую этот код:Как изменить шрифт ящика для навигации?

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 

и Android - Is Navigation Drawer from right hand side possible?

Но, как вы знаете, это работает только в API 17 и выше. Пожалуйста, помогите! Как изменить шрифт меню? Как правильно сделать макет RTL ?!

Отредактировано: Мой файл шрифта «TTF» в активах/шрифты и я знаю, как это сделать для TextView с помощью Java, но я не знаю, как установить его в меню навигации ящик.

+0

Вы использовали пользовательскую строку xml для управления меню .. тогда я мог бы рассказать вам, как вы меняете шрифт текста меню –

+0

@Tanimreja Да, я сделал! –

ответ

26

Я нашел ответ: сначала создать этот класс в вашем проекте:

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

Затем добавить этот метод к вашей деятельности вы хотите изменить шрифт меню навигационного ящика:

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

, а затем добавить метод, который вы только что добавили в свою деятельность:

navView = (NavigationView) findViewById(R.id.navView); 
Menu m = navView.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); 
} 
+0

хороший. но как изменить направление слева направо. Я имею в виду, что это RTL. но для всех API не только для 17 и выше? –

+0

@HosseinMansouri в этом случае вам нужно добавить ящик в свой проект вручную, а не использовать библиотеку ящиков Google. –

+0

любой образец выдвижного ящика? –

1

Это работает для шрифтов Только

  1. Прежде всего добавить цвет вашего шрифта (если вы хотите изменить) в colors.xml файл, расположенный на res->values->colors.xml как

    <color name="black">#000000</color> // it's for black don't go for white color 
    
  2. Затем отредактируйте style.xml файл, расположенный в каталоге с одинаковыми значениями (есть два файла, которые редактируют этот файл, который имеет вашу тему со стилем name="your_theme" или найдите строку в этом файле e

  3. Здесь мы должны установить свойство font. Таким образом, вы должны создать новый тег стиля в приложении тегов ресурсов. в моем случае я создаю

    <style name="MyText" parent="@android:style/TextAppearance.Medium"> 
        <item name="android:textSize">20sp</item> //size of font 
        <item name="android:textColor">@color/black</item> //color of font 
        <item name="android:typeface">sans</item> // type how it appear 
    </style> 
    

    Обратите внимание, что имя, данное для этого тега MyText. Теперь мы должны использовать это имя в надписном блоке первого стиля, имя которого - ваша тема приложения.

  4. Упоминается этот новый стиль в теге стиля тега appication. В моем случае его как

    <!-- Base application theme. --> 
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
         <!-- Customize your theme here. --> 
         <item name="colorPrimary">@color/colorPrimary</item> 
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
         <item name="colorAccent">@color/colorAccent</item> 
         <item name="android:textViewStyle">@style/MyText</item> //MyText its custom style for font 
        </style> 
    
+1

В моем случае это работает .... – Abhishek

+0

@Abishek Это не изменило шрифта. Это только изменил размер и цвет. И, конечно, никаких изменений в навигационном ящике !!!! Кроме того, файл шрифта находится в папке «Ресурсы/шрифты». –

2

Спасибо!Я успешно изменен шрифт на панели навигации на основе @Amir H ​​пост, но с конфигурацией (просто добавьте это несколько строк в вашей деятельности)

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 
     Menu m = navigationView .getMenu(); 

     for (int i=0;i<m.size();i++) { 
      MenuItem mi = m.getItem(i); 

      //for applying 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); 
        SpannableString s = new SpannableString(subMenuItem.getTitle()); 
        s.setSpan(new TypefaceSpan("fonts/yourfontname.ttf"), 0, s.length(), 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        subMenuItem.setTitle(s); 
       } 
      } 

     } 

Может быть, это поможет кому-то :)

4

Добавление ответа rischan в ,

Я отредактировал 'mi' непосредственно, поскольку это мои названия в меню ящика. Затем я изменил параметр s.setSpan 1, чтобы использовать пользовательский класс CustomTypefaceSpan.

// Navigation View 
    NavigationView navigationView = (NavigationView) 
    findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

    Menu m = navigationView .getMenu(); 

    Typeface tf1 = Typeface.createFromAsset(getAssets(), "font/Gotham Narrow Extra Light.otf"); 

    for (int i=0;i<m.size();i++) { 

     MenuItem mi = m.getItem(i); 

     SpannableString s = new SpannableString(mi.getTitle()); 
     s.setSpan(new CustomTypefaceSpan("", tf1), 0, s.length(), 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     mi.setTitle(s); 

    } 

CustomTypefaceSpan Класс:

package my.app; 
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); 
    } 
} 

Не могу поверить, насколько сложно это просто изменить шрифты для меню.

+0

+1 для пользовательских усилий по увеличению шрифта и добавить шрифт для подменю too.so, что это будет четкий ответ для общего меню навигации. –

Смежные вопросы