是否可以在Android应用程序中设置自定义字体?
我尝试了发布的here,但我不知道我的extends Application
类在哪里……
有什么帮助吗?
编辑:
我尝试了以下几种方法:
从my AndroidManifest.xml
.
Application
MyApp.java:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
FontsOverride.setDefaultFont(this, "DEFAULT", "raleway_regular.ttf");
// This FontsOverride comes from the example I posted above
}
}
AndroidManifest.xml:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name=".MyApp"
android:theme="@style/AppTheme">
....
styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:fontFamily">default</item>
</style>
但是我的字体还是不是长宁的……有什么想法吗?
然后调用MyApp
类。但对我的字体没有影响...
EDIT2:在我为按钮设置了自定义样式后,我意识到我的按钮应用了自定义字体。下面是我的自定义按钮样式:
<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
<item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item>
</style>
下面是它现在的样子:
所以:我的按钮是应用样式,而不是TextView
。你知道为什么我的自定义字体没有应用于应用程序中的所有项目吗?
发布于 2015-11-26 02:29:20
写一个类
public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}
现在下一件事是在应用程序标记AndroidManifest.xml中为您的应用程序类提供名称。在本例中,它是MyApp
<application
android:name=".MyApp"
...
>
...
</application>
因此,每当打开应用程序时,都会调用MyApp类的onCreate方法,并设置字体。
更新将font文件放在assets/fonts/your_font_file.ttf下
将这一行放在应用程序类(MyApp)的onCreate方法下
TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");
TypefaceUtil的源文件
public class TypefaceUtil {
/**
* Using reflection to override default typeface
* NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
*
* @param context to work with assets
* @param defaultFontNameToOverride for example "monospace"
* @param customFontFileNameInAssets file name of the font from assets
*/
public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Map<String, Typeface> newMap = new HashMap<String, Typeface>();
newMap.put("serif", customFontTypeface);
try {
final Field staticField = Typeface.class
.getDeclaredField("sSystemFontMap");
staticField.setAccessible(true);
staticField.set(null, newMap);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
try {
final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
defaultFontTypefaceField.setAccessible(true);
defaultFontTypefaceField.set(null, customFontTypeface);
} catch (Exception e) {
Log.e(TypefaceUtil.class.getSimpleName(), "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
}
}
}
}
现在更新您的style.xml文件
将清单文件中包含的您的活动样式放在下面一行
<item name="android:typeface">serif</item>
希望这能有所帮助
发布于 2017-02-14 13:54:55
编辑
对于最新的uk.co.chrisjenx:calligraphy
版本,android Lib没有更多的维护,替代版本现在是https://github.com/InflationX/Calligraphy
dependencies {
implementation 'io.github.inflationx:calligraphy3:3.1.1'
implementation 'io.github.inflationx:viewpump:2.0.3'
}
将您的自定义字体添加到资源/
用法
对于默认字体
在#onCreate()方法的应用程序类中使用CalligraphyConfig定义默认字体,并将其传递给添加到ViewPump构建器的CalligraphyInterceptor。
@Override
public void onCreate() {
super.onCreate();
ViewPump.init(ViewPump.builder()
.addInterceptor(new CalligraphyInterceptor(
new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf")
.setFontAttrId(R.attr.fontPath)
.build()))
.build());
//....
}
注入上下文:包装活动上下文:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}
自定义样式
<style name="TextViewCustomFont">
<item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>
对于主题
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>
<style name="AppTheme.Widget"/>
<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
<item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>
下面的解决方案没有更多的由开发人员维护
android中有一个很棒的自定义字体库:书法
下面是一个如何使用它的示例。
在Gradle中,你需要把这一行放到你的应用的build.gradle文件中:
dependencies {
compile 'uk.co.chrisjenx:calligraphy:2.2.0'
}
然后创建一个扩展Application的类,并编写以下代码:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("your font path")
.setFontAttrId(R.attr.fontPath)
.build()
);
}
}
您应该已经在assets/ a "New Directory“"fonts”(见下文)上进行了设置,因此在该代码中“您的字体路径”应该是"fonts/SourceSansPro-Regular.ttf“。(这只是“字体...”不是"/fonts..“或“资产..”)
在activity类中,将此方法放在onCreate之前:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
清单文件的最后一件事应该是:
<application
.
.
.
android:name=".App">
它会将整个活动更改为您的字体!这是简单和干净的!
在Assets上,您应该右键单击New Directory,将其称为"fonts“。在查找器中,将.ttf
字体文件放入其中。
另外,不要忘记在attrs.xml中添加以下两行代码,如果您没有attrs.xml文件,请在values.xml中创建新文件
<attr format="string" name="fontPath"/>
<item name="calligraphy_tag_id" type="id"/>
发布于 2018-02-07 15:48:44
我所做的就是:
1:在RES文件夹中添加"new resource directory“,在给出的下拉列表中选择"font”资源类型,将新目录命名为"font“并保存。
2:将我的custom_font.ttf添加到刚刚创建的字体文件夹中。
3:在STYLES.XML的应用程序基础主题中添加自定义字体
好了。
https://stackoverflow.com/questions/33923803
复制相似问题