web-dev-qa-db-ja.com

ナビゲーションドロワーのフォントを変更するには?

Androidのナビゲーションドロワーに独自のフォントを使用したいと思います。ライブラリに付属するAndroidこの回答によるとスタジオ: https://stackoverflow.com/a/23632492/4393226 。しかし、フォントを変更してRTLにする方法がわからないので、よく検索して、引き出しRTLの作成方法を見つけました。このコードを使用します。

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

および Android-右側からのナビゲーションドロワーは可能ですか?

ただし、ご存知のように、これはAPI 17以降でのみ機能します。助けてください!メニューのフォントを変更するには?レイアウトRTLを正しい方法で作成するには?!

Edited:私のフォント「TTF」ファイルはasset/fontsにあり、Javaを使用してtextviewに設定する方法を知っていますが、わかりませんナビゲーションドロワーメニューに設定する方法。

14
Amir H

私は答えを見つけました:最初にプロジェクトでこのクラスを作成します:

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);
}
36
Amir H

より簡単な方法でこれを行うことができます。

最初にstyle.xmlに移動し、新しいスタイルを作成します。

 <style name="RobotoTextViewStyle" parent="Android:Widget.TextView">
      <item name="Android:fontFamily">@font/sans-serif-smallcaps</item>
 </style>

2番目は、ナビゲーションxmlコードに移動して、アイテムテキストの外観を設定に移動します。

app:itemTextAppearance="@style/RobotoTextViewStyle"

これで、最終的なナビゲーションコードはこれになります。

<Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:itemTextAppearance="@style/RobotoTextViewStyle"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_home"
        app:menu="@menu/activity_home_drawer" />
19
Shrawan

ステップ1:style.xmlで次のようにスタイルを作成する

<style name="NavigationView" >
<item name="fontFamily">@font/helvetica_neue_light</item>
</style>

ステップ2:Android.support.design.widget.NavigationViewにスタイルをテーマとして追加する

Android:theme = "@ style/NavigationView"

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

メニューのフォントを変更するだけでどれほど複雑になるか信じられません。

9
williamsi

ありがとうございました! @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);
                }
            }

        }

たぶんそれは誰かを助けるでしょう:)

5
rischan

フォントのみで機能します

  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"のテーマを持つファイルを編集する2つのファイルがあるか、その2つのファイルで行を検索します

  3. ここでは、フォントプロパティを設定する必要があります。そのため、リソースタグを囲む新しいスタイルタグを作成する必要があります。私の場合、私は作成します

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