如何更改导航抽屉字体?
How to change navigation drawer font?
我想在 android.I 中使用我自己的导航抽屉字体,根据这个答案使用 android studio 自带的库:。
但我不知道如何更改字体并使其成为 RTL。
我搜索了很多,找到了如何制作抽屉 RTL。我使用此代码:
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
和
Android - Is Navigation Drawer from right hand side possible?
但如您所知,这仅适用于 API 17 及更高版本。
请帮忙!如何更改菜单字体?如何正确布局RTL?!
已编辑:
我的字体 "TTF" 文件在 assets/fonts 中,我知道如何使用 java 为文本视图设置它,但我不知道如何将它设置为导航抽屉菜单。
仅适用于字体
首先在位于 res->values->colors.xml
的 colors.xml
文件中添加字体颜色(如果你想更改),如
<color name="black">#000000</color> // it's for black don't go for white color
然后编辑位于相同值目录的 style.xml
文件(有两个文件编辑该文件,其主题具有样式 name="your_theme"
或在这两个文件中找到行
这里我们要设置字体属性。所以你必须在封闭的资源标签中创建新的样式标签。在我的例子中,我创建了
<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
。现在我们必须在上面的第一个样式块中使用这个名称,其名称是您的应用程序主题。
在上面的应用主题样式标签中提到了这个新样式。就我而言,它就像
<!-- 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>
我找到了答案:
首先在您的项目中创建此 class:
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);
}
}
然后将此方法添加到您要更改导航抽屉菜单字体的activity:
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);
}
然后添加调用您刚刚在 activity:
中添加的方法
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);
}
谢谢!我已经根据@Amir H post 成功更改了导航抽屉上的字体,但使用了配置(只需将这几行添加到您的 activity)
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);
}
}
}
也许它会对某人有所帮助:)
添加到 rischan 的回答中。
我直接编辑了 'mi',因为这些是我的抽屉菜单标题。然后我将 s.setSpan 第一个参数更改为使用自定义 class 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 Class:
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);
}
}
简直不敢相信仅仅更改菜单的字体就这么复杂。
步骤1:Make样式如下style.xml
<style name="NavigationView" >
<item name="fontFamily">@font/helvetica_neue_light</item>
</style>
第 2 步:
在您的中添加样式作为主题
android.support.design.widget.NavigationView
android:主题="@style/NavigationView"
您可以通过更简单的方式完成此操作。
首先进入style.xml并在那里创建一个新样式。
<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
<item name="android:fontFamily">@font/sans-serif-smallcaps</item>
</style>
第二个是转到您的导航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" />
我想在 android.I 中使用我自己的导航抽屉字体,根据这个答案使用 android studio 自带的库:。 但我不知道如何更改字体并使其成为 RTL。 我搜索了很多,找到了如何制作抽屉 RTL。我使用此代码:
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
和 Android - Is Navigation Drawer from right hand side possible?
但如您所知,这仅适用于 API 17 及更高版本。 请帮忙!如何更改菜单字体?如何正确布局RTL?!
已编辑: 我的字体 "TTF" 文件在 assets/fonts 中,我知道如何使用 java 为文本视图设置它,但我不知道如何将它设置为导航抽屉菜单。
仅适用于字体
首先在位于
res->values->colors.xml
的colors.xml
文件中添加字体颜色(如果你想更改),如<color name="black">#000000</color> // it's for black don't go for white color
然后编辑位于相同值目录的
style.xml
文件(有两个文件编辑该文件,其主题具有样式name="your_theme"
或在这两个文件中找到行这里我们要设置字体属性。所以你必须在封闭的资源标签中创建新的样式标签。在我的例子中,我创建了
<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
。现在我们必须在上面的第一个样式块中使用这个名称,其名称是您的应用程序主题。在上面的应用主题样式标签中提到了这个新样式。就我而言,它就像
<!-- 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>
我找到了答案: 首先在您的项目中创建此 class:
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);
}
}
然后将此方法添加到您要更改导航抽屉菜单字体的activity:
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);
}
然后添加调用您刚刚在 activity:
中添加的方法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);
}
谢谢!我已经根据@Amir H post 成功更改了导航抽屉上的字体,但使用了配置(只需将这几行添加到您的 activity)
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);
}
}
}
也许它会对某人有所帮助:)
添加到 rischan 的回答中。
我直接编辑了 'mi',因为这些是我的抽屉菜单标题。然后我将 s.setSpan 第一个参数更改为使用自定义 class 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 Class:
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);
}
}
简直不敢相信仅仅更改菜单的字体就这么复杂。
步骤1:Make样式如下style.xml
<style name="NavigationView" >
<item name="fontFamily">@font/helvetica_neue_light</item>
</style>
第 2 步: 在您的中添加样式作为主题 android.support.design.widget.NavigationView
android:主题="@style/NavigationView"
您可以通过更简单的方式完成此操作。
首先进入style.xml并在那里创建一个新样式。
<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
<item name="android:fontFamily">@font/sans-serif-smallcaps</item>
</style>
第二个是转到您的导航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" />