2016-01-05 14 views
7

Ich möchte meine eigene Schriftart für Navigation Schublade in Android.I verwenden Sie die Bibliothek kommt mit Android Studio nach dieser Antwort: https://stackoverflow.com/a/23632492/4393226. Aber ich weiß nicht, wie man die Schriftart ändert und es RTL macht. Ich suchte viel und ich fand, wie man die Schublade RTL macht. Ich benutze diesen Code:Wie ändert man die Schriftart der Navigationsschublade?

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

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

Aber wie Sie wissen, das funktioniert nur in API 17 und höher. Bitte helfen! Wie ändere ich die Menüschrift? Wie mache ich das Layout RTL richtig ?!

Herausgegeben: Meine Schrift „TTF“ Datei ist in Vermögenswerte/fonts und ich weiß, wie es für eine Textview setzen Java, aber ich weiß nicht, wie es auf Navigationsleiste Menü.

+0

Haben Sie eine benutzerdefinierte XML-Zeile für die Verwaltung von Menü verwendet .. dann könnte ich Ihnen sagen, wie Sie Ihre Menü-Schriftart ändern –

+0

@Tanimreja Ja, tat ich! –

Antwort

26

fand ich die Antwort: Erste diese Klasse in Ihrem Projekt erstellen:

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

Dann diese Methode, um Ihre Aktivität fügen Sie die Schriftart ändern möchten Navigationsmenü:

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

und dann fügen Sie die Methode hinzu, die Sie gerade in Ihrer Aktivität hinzugefügt haben:

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

ausgezeichnet. aber wie man die Richtung von links nach rechts ändert. Ich meine, setze es als RTL. aber für alle APIs nicht nur für 17 und höher? –

+0

@HosseinMansouri in diesem Fall müssen Sie Schublade in Ihrem Projekt manuell hinzufügen und nicht die Google Navigation Schubladenbibliothek verwenden. –

+0

eine beliebige Schublade? –

1

Es funktioniert für Fonts Nur

  1. First Of All In Farbe Ihrer Schrift (wenn Sie ändern möchten) in colors.xml Datei auf res->values->colors.xml befindet wie

    <color name="black">#000000</color> // it's for black don't go for white color 
    
  2. Dann bearbeiten style.xml Datei im gleichen Werte-Verzeichnis (es gibt zwei Dateien bearbeiten diese Datei, die Ihr Thema mit Stil name="your_theme" oder finden Sie Zeile in diesem zwei fil e

  3. Hier müssen wir Schriftart Eigenschaft einstellen. Sie müssen also ein neues Stil-Tag in umschließenden Ressourcen-Tags erstellen. Ich in meinem Fall erstellen

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

    Beachten Sie, dass der Name dieses Tag gegeben MyText ist. Jetzt müssen wir diesen Namen im ersten Block verwenden, dessen Name das Anwendungsthema ist.

  4. Erwähnte diesen neuen Stil im oben genannten Thema Stil-Tag. In meinem Fall seine wie

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

In meinem Fall funktioniert es .... – Abhishek

+0

@Abishek Es hat die Schriftart nicht geändert. Es hat nur die Größe und Farbe geändert. Und natürlich keine Änderung in der Navigationsschublade !!!! Außerdem befindet sich meine Schriftdatei im Ordner "Assets/Fonts". –

2

Vielen Dank!Ich habe erfolgreich Schriftart auf Navigationsleiste basierend auf @Amir H ​​Post geändert, aber mit Konfiguration (nur dies mehrere Zeilen in Ihre Aktivität hinzufügen)

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

     } 

Vielleicht wird es helfen, jemand :)

4

auf Antwort des rischan Hinzufügen .

Ich habe "mi" direkt bearbeitet, da dies meine Menütitel sind. Dann änderte ich den s.setSpan 1st Parameter, um eine benutzerdefinierte Klasse CustomTypefaceSpan zu verwenden.

// 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 Klasse:

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

Kann nicht glauben, wie kompliziert es die Schriftarten für das Menü einfach zu ändern ist.

+0

+1 für benutzerdefinierte Schrift Mühe und fügen Sie Schriftart für das Untermenü zu.so, dass es klare Antwort für das gesamte Navigationsmenü wäre. –

Verwandte Themen