我在我的应用中使用Roboto light字体。要设置字体,我要将android:fontFamily="sans-serif-light"
添加到每个视图。有没有办法将Roboto字体声明为整个应用程序的默认字体系列?我试过这样的但似乎不起作用。
<style name="AppBaseTheme" parent="android:Theme.Light"></style>
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:fontFamily">sans-serif-light</item>
</style>
答案 0 :(得分:246)
答案是肯定的。
适用于TextView
和Button
类的全球Roboto:
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
<item name="android:buttonStyle">@style/RobotoButtonStyle</item>
</style>
<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
<item name="android:fontFamily">sans-serif-light</item>
</style>
<style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
<item name="android:fontFamily">sans-serif-light</item>
</style>
只需从列表themes.xml中选择所需的样式,然后根据原始样式创建自定义样式。最后,将样式应用为应用程序的主题。
<application
android:theme="@style/AppTheme" >
</application>
它只适用于像Roboto这样的内置字体,但这就是问题所在。 对于自定义字体(例如从资源加载),此方法无效。
编辑08/13/15
如果您正在使用AppCompat主题,请记住删除android:
前缀。例如:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
<item name="buttonStyle">@style/RobotoButtonStyle</item>
</style>
请注意buttonStyle
不包含android:
前缀,但textViewStyle
必须包含{。}}。
答案 1 :(得分:105)
随着Android Oreo的发布,您可以使用支持库来实现这一目标。
在您的应用主样式中引用您的默认字体系列:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:fontFamily">@font/your_font</item>
<item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 if theme other than AppCompat -->
</style>
查看https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html以获取更多详细信息。
答案 2 :(得分:32)
阅读更新
我有同样的问题,嵌入一个新字体,最后得到它扩展TextView并在其中设置typefont。
public class YourTextView extends TextView {
public YourTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public YourTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public YourTextView(Context context) {
super(context);
init();
}
private void init() {
Typeface tf = Typeface.createFromAsset(context.getAssets(),
"fonts/helveticaneue.ttf");
setTypeface(tf);
}
}
您必须稍后将TextView Elements更改为从每个元素更改为。如果您在Eclipse中使用UI-Creator,有时他不会正确显示TextViews。唯一对我有用的东西......
<强>更新强>
现在我正在使用反射来改变整个应用程序中的字体而不扩展TextViews。 Check out this SO post
更新2
从API级别26开始并在“支持库”中可用,您可以使用
android:fontFamily="@font/embeddedfont"
更多信息:Fonts in XML
答案 3 :(得分:14)
要更改您的应用程序字体,请执行以下步骤:
res
目录内创建新目录,并将其命名为font
。res
里面的values
-> styles.xml
里面的<resources>
-> <style>
内添加字体<item name="android:fontFamily">@font/font_name</item>
。现在,您所有的应用程序文字都应位于您添加的文本中。
答案 4 :(得分:6)
不谈性能,对于自定义字体,如果它是TextView,您可以通过所有视图循环方法循环并设置字体:
public class Font {
public static void setAllTextView(ViewGroup parent) {
for (int i = parent.getChildCount() - 1; i >= 0; i--) {
final View child = parent.getChildAt(i);
if (child instanceof ViewGroup) {
setAllTextView((ViewGroup) child);
} else if (child instanceof TextView) {
((TextView) child).setTypeface(getFont());
}
}
}
public static Typeface getFont() {
return Typeface.createFromAsset(YourApplicationContext.getInstance().getAssets(), "fonts/whateverfont.ttf");
}
}
在你的所有活动中,在setContentView之后将当前的ViewGroup传递给它并完成它:
ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
Font.setAllTextView(group);
对于片段,你可以做类似的事情。
答案 5 :(得分:4)
为整个应用程序执行此操作的另一种方法是使用基于此answer
的反射public class TypefaceUtil {
/**
* Using reflection to override default typefaces
* NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE
* OVERRIDDEN
*
* @param typefaces map of fonts to replace
*/
public static void overrideFonts(Map<String, Typeface> typefaces) {
try {
final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
field.setAccessible(true);
Map<String, Typeface> oldFonts = (Map<String, Typeface>) field.get(null);
if (oldFonts != null) {
oldFonts.putAll(typefaces);
} else {
oldFonts = typefaces;
}
field.set(null, oldFonts);
field.setAccessible(false);
} catch (Exception e) {
Log.e("TypefaceUtil", "Can not set custom fonts");
}
}
public static Typeface getTypeface(int fontType, Context context) {
// here you can load the Typeface from asset or use default ones
switch (fontType) {
case BOLD:
return Typeface.create(SANS_SERIF, Typeface.BOLD);
case ITALIC:
return Typeface.create(SANS_SERIF, Typeface.ITALIC);
case BOLD_ITALIC:
return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC);
case LIGHT:
return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL);
case CONDENSED:
return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL);
case THIN:
return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL);
case MEDIUM:
return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL);
case REGULAR:
default:
return Typeface.create(SANS_SERIF, Typeface.NORMAL);
}
}
}
然后,只要你想覆盖字体,你就可以调用方法并给它一个字体图,如下所示:
Typeface regular = TypefaceUtil.getTypeface(REGULAR, context);
Typeface light = TypefaceUtil.getTypeface(REGULAR, context);
Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context);
Typeface thin = TypefaceUtil.getTypeface(THIN, context);
Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context);
Map<String, Typeface> fonts = new HashMap<>();
fonts.put("sans-serif", regular);
fonts.put("sans-serif-light", light);
fonts.put("sans-serif-condensed", condensed);
fonts.put("sans-serif-thin", thin);
fonts.put("sans-serif-medium", medium);
TypefaceUtil.overrideFonts(fonts);
完整示例check
这仅适用于早期版本的Android SDK 21及更高版本,请查看完整示例
答案 6 :(得分:4)
只需使用此lib在您的成绩档案中编译它
complie'me.anwarshahriar:calligrapher:1.0'
并在主要活动
中的onCreate方法中使用它Calligrapher calligrapher = new Calligrapher(this);
calligrapher.setFont(this, "yourCustomFontHere.ttf", true);
这是最优雅的超快方式。
答案 7 :(得分:4)
在您的res / value / styles.xml中添加此行代码
<item name="android:fontFamily">@font/circular_medium</item>
整个样式看起来像这样
<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:fontFamily">@font/circular_medium</item>
</style>
将“ circular_medium”更改为您自己的字体名称。
答案 8 :(得分:1)
这是我的项目的工作,来源https://gist.github.com/artem-zinnatullin/7749076
在Asset Folder中创建字体目录,然后将自定义字体复制到fonts目录,例如我正在使用trebuchet.ttf;
创建一个类TypefaceUtil.java;
import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;
import java.lang.reflect.Field;
public class TypefaceUtil {
public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
try {
final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);
final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
defaultFontTypefaceField.setAccessible(true);
defaultFontTypefaceField.set(null, customFontTypeface);
} catch (Exception e) {
}
}
}
在styles.xml中编辑主题,在下面添加
<item name="android:typeface">serif</item>
我的styles.xml中的示例
<resources>
<!-- 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:typeface">serif</item><!-- Add here -->
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>
最后,在Activity或Fragment onCreate中调用TypefaceUtil.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TypefaceUtil.overrideFont(getContext(), "SERIF", "fonts/trebuchet.ttf");
}
答案 9 :(得分:0)
Android不支持在整个应用程序中应用字体(请参阅此issue)。您有4个选项可以为整个应用设置字体:
可以找到这些选项的详细信息here。
答案 10 :(得分:0)
我知道这个问题很老了,但我找到了一个很好的解决方案。 基本上,您将容器布局传递给此函数,它将字体应用于所有支持的视图,并在子布局中递归cicle:
public static void setFont(ViewGroup layout)
{
final int childcount = layout.getChildCount();
for (int i = 0; i < childcount; i++)
{
// Get the view
View v = layout.getChildAt(i);
// Apply the font to a possible TextView
try {
((TextView) v).setTypeface(MY_CUSTOM_FONT);
continue;
}
catch (Exception e) { }
// Apply the font to a possible EditText
try {
((TextView) v).setTypeface(MY_CUSTOM_FONT);
continue;
}
catch (Exception e) { }
// Recursively cicle into a possible child layout
try {
ViewGroup vg = (ViewGroup) v;
Utility.setFont(vg);
continue;
}
catch (Exception e) { }
}
}
答案 11 :(得分:0)
仅将应用的字体设置为normal
,sans
,serif
或monospace
(不是自定义字体!),您可以执行此操作。 强>
定义主题并将android:typeface
属性设置为您要在styles.xml
中使用的字体:
<resources>
<!-- custom normal activity theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- other elements -->
<item name="android:typeface">monospace</item>
</style>
</resources>
将主题应用于AndroidManifest.xml
文件中的整个应用:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application
android:theme="@style/AppTheme" >
</application>
</manifest>
答案 12 :(得分:0)
试试这个库,它轻巧且易于实现
https://github.com/sunnag7/FontStyler
<com.sunnag.fontstyler.FontStylerView
android:textStyle="bold"
android:text="@string/about_us"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="8dp"
app:fontName="Lato-Bold"
android:textSize="18sp"
android:id="@+id/textView64" />
答案 13 :(得分:0)
这是我们的操作方式:
private static void OverrideDefaultFont(string defaultFontNameToOverride, string customFontFileNameInAssets, AssetManager assets)
{
//Load custom Font from File
Typeface customFontTypeface = Typeface.CreateFromAsset(assets, customFontFileNameInAssets);
//Get Fontface.Default Field by reflection
Class typeFaceClass = Class.ForName("android.graphics.Typeface");
Field defaultFontTypefaceField = typeFaceClass.GetField(defaultFontNameToOverride);
defaultFontTypefaceField.Accessible = true;
defaultFontTypefaceField.Set(null, customFontTypeface);
}
答案 14 :(得分:0)
在 Android Studio 中很容易做到。
minsdkveriosn
。它必须需要 minsdkversion >=16
在你的 style.xml 文件中,在“基本应用程序主题”的样式下添加这一行。
<item name="android:fontFamily">@font/ubuntubold</item>
答案 15 :(得分:-4)
答案是否定的,你不能。 见Is it possible to set a custom font for entire of application? 欲获得更多信息。
有一些解决方法,但是“这里的一行代码和我的所有字体 而不是 ”的行中没有任何内容。
(我有点感谢Google和Apple-)。自定义字体有一个地方,但让它们更容易替换应用程序范围,会创建一个Comic Sans应用程序的整个世界