是否可以在Android应用程序中设置自定义字体?
我尝试了这里发布的内容,但我不知道我的extends Application
课程在哪里......
有帮助吗?
编辑:
我尝试了以下方法:
添加一个扩展自的新类 Application
从我的电话中调用这个新课程AndroidManifest.xml
.
我按照我的风格添加了它.
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
}
}
Run Code Online (Sandbox Code Playgroud)
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">
....
Run Code Online (Sandbox Code Playgroud)
styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:fontFamily">default</item>
</style>
Run Code Online (Sandbox Code Playgroud)
但我的字体仍然没有变换......任何想法?
然后MyApp
调用该类.但对我的字体没有影响......
EDIT2:我意识到在为按钮设置自定义样式后,我的按钮会应用自定义字体.这是我的自定义按钮样式:
<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
<item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)
以下是它现在的样子:
所以:我的按钮正在应用样式,但不是TextView
.有关为什么我的自定义字体没有应用于应用程序中的所有项目的任何想法?
Raj*_*sit 75
在android中有一个很棒的自定义字体库:书法
以下是如何使用它的示例.
在Gradle中,您需要将此行放入应用程序的build.gradle文件中:
dependencies {
compile 'uk.co.chrisjenx:calligraphy:2.2.0'
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个扩展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()
);
}
}
Run Code Online (Sandbox Code Playgroud)
您应该在资产上创建一个"新目录""字体"(见下文),因此在该代码中"您的字体路径"应为"fonts/SourceSansPro-Regular.ttf".(它只是"字体......"而不是"/ fonts .."或"assets ..")
并且在activity类中将此方法放在onCreate之前:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
Run Code Online (Sandbox Code Playgroud)
你的清单文件应该是这样的最后一件事:
<application
.
.
.
android:name=".App">
Run Code Online (Sandbox Code Playgroud)
它会将整个活动改为你的字体!它简单而干净!
在资产上,您应该右键单击"新建目录",将其命名为"fonts".在finder中将.ttf
字体文件放在那里.
也不要忘记在attrs.xml中添加以下两行,如果你没有attrs.xml文件,在values.xml中创建新文件
<attr format="string" name="fontPath"/>
<item name="calligraphy_tag_id" type="id"/>
Run Code Online (Sandbox Code Playgroud)
Nit*_*sta 47
写一堂课
public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}
Run Code Online (Sandbox Code Playgroud)
现在接下来的事情是在AndroidManifest.xml中为应用程序标记提供应用程序类的名称.在这种情况下,它是MyApp
<application
android:name=".MyApp"
...
>
...
</application>
Run Code Online (Sandbox Code Playgroud)
因此,每当打开App时,都会调用MyApp类的onCreate方法,并设置字体.
更新 将字体文件置于assets/fonts/your_font_file.ttf下
将此行放在应用程序类的onCreate方法下(MyApp)
TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在更新style.xml文件
将下面的行放在清单文件中为您的活动包含的样式
<item name="android:typeface">serif</item>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助
Num*_*qmr 42
我所做的只是:
1:在RES文件夹中添加"新资源目录",从下拉列表中选择RESOURCE TYPE作为"font",命名为新目录"font"并保存.
2:将我的"custom_font.ttf"添加到刚刚创建的FONT文件夹中.
3:在STYLES.XML的应用程序基础主题中添加了我的自定义字体
DONE.
小智 10
您可以使用Android SDK现在就这样做,为Android开发者官方YouTube频道组/ 2017年发表在这里.
需要API级别26(Android 8 Oreo)及更高版本.
您只需将字体文件放在res/font
文件夹中,并在TextView
需要具有该android:fontFamily
属性的特定文件时引用它们.
如果您想在整个应用程序上使用基本字体,只需输入即可
<item name="android:fontFamily">@font/yourfontname</item>
Run Code Online (Sandbox Code Playgroud)
在你的 styles.xml
如果您愿意,也可以从Android Studio下载自定义字体.所有这些都可以在上面的视频中找到详细信息.
小智 6
Android提供了更简单,最好的解决方案,支持库26+在API级别14上提供了支持。XML中的字体它还支持字体系列选项。必需的导入:
implementation "com.android.support:support-compat:<26+ version>"
遵循以下简单步骤,字体家族将毫无障碍地应用在您的应用中:
Run Code Online (Sandbox Code Playgroud)<?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android"> <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/lobster_regular" /> <font android:fontStyle="italic" android:fontWeight="400" android:font="@font/lobster_italic" /> </font-family>
Run Code Online (Sandbox Code Playgroud)<item name="android:fontFamily">@font/opensans</item>
或使用以下方式以编程方式设置字体
view.setTypeface(ResourcesCompat.getFont(context, R.font.opensans));
Run Code Online (Sandbox Code Playgroud)小智 5
res
,然后从new
选项中选择Android Resource Directory
并选择font
表单Resource type
并按确定,这将创建字体目录以将您的字体放入其中。.ttf
字体文件放在那里。转到以下路径中存在的项目样式文件res/values/styles.xml
并添加如下样式:
<style name="SansSerifFont">
<item name="android:fontFamily">sans-serif</item>
</style>
<style name="OpenSansFont">
<item name="android:fontFamily">@font/open_sans</item>
</style>
<style name="IranianSansFont">
<item name="android:fontFamily">@font/iranian_sans</item>
</style>
<style name="BYekanFont">
<item name="android:fontFamily">@font/b_yekan</item>
</style>
<style name="DroidArabicFont">
<item name="android:fontFamily">@font/droid_arabic</item>
</style>
Run Code Online (Sandbox Code Playgroud)转到您的代码并编写一个类似这样的类来更改整个应用程序字体:
public class AppFontManager {
private AppCompatActivity appCompatActivity;
public static final String SANS_SERIF_APP_FONT = "sans_serif";
public static final String B_YEKAN_APP_FONT = "b_yekan";
public static final String DROID_ARABIC_APP_FONT = "droid_arabic";
public static final String IRANIAN_SANS_APP_FONT = "iranian_sans";
public static final String OPEN_SANS_APP_FONT = "open_sans";
public AppAppearanceManager(AppCompatActivity appCompatActivity) {
this.appCompatActivity = appCompatActivity;
}
public void setFont(String fontName){
switch (fontName){
case SANS_SERIF_APP_FONT:{
appCompatActivity.getTheme().applyStyle(R.style.SansSerifFont, true);
break;
}
case B_YEKAN_APP_FONT:{
appCompatActivity.getTheme().applyStyle(R.style.BYekanFont, true);
break;
}
case DROID_ARABIC_APP_FONT:{
appCompatActivity.getTheme().applyStyle(R.style.DroidArabicFont, true);
break;
}
case IRANIAN_SANS_APP_FONT:{
appCompatActivity.getTheme().applyStyle(R.style.IranianSansFont, true);
break;
}
case OPEN_SANS_APP_FONT:{
appCompatActivity.getTheme().applyStyle(R.style.OpenSansFont, true);
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因为字体应该为每个活动单独设置,所以我更喜欢为其编写一个类以获得更干净的代码。
然后在 Activity onCreate 之前调用类方法super.onCreate(savedInstanceState)
:
@Override
protected void onCreate(Bundle savedInstanceState) {
new AppAppearanceManager(this).setFont(APP_DEFAULT_FONT);
super.onCreate(savedInstanceState);
// Do you stuff there...
}
Run Code Online (Sandbox Code Playgroud)
请记住,如果您想在运行SharedPreferences
时更改字体,请在等中写入所选字体,然后将所选字体传递给setFont
上述所有活动。
这就是我将字体 ttf 应用到整个应用程序的方式
1、在res目录下创建一个名为font的目录
2.将字体 ttf 例如 varela.ttf 复制到该字体目录中
3.检查AndroidManifest.xml中的主题
<application
android:theme="@style/Theme.MyAppTheme">
<activity
......
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
4.转到values目录中的themes.xml,并在AndroidManifest.xml中引用的基本主题样式中添加带有项目标签的字体
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.MyAppTheme"
parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<item name="android:fontFamily">@font/varela</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
61249 次 |
最近记录: |