Using the Fonts in XML feature you can specify various font weights for a font family. For example:
Please see the official Android reference for Font Weight Values:
android:fontWeight
Integer. The weight of the font. This attribute is used when the font is loaded into the font stack and overrides any weight information in the font's header tables. The attribute value must be a positive number, a multiple of 100, and between 100 and 900, inclusive. If you do not specify the attribute, the app uses the value from the font's header tables. The most common values are 400 for regular weight and 700 for bold weight.
https://developer.android.com/guide/topics/resources/font-resource
Edit: this isn't a solution the the request :/
I've found the Typeface.Builder class which I think is what you want. Unfortunately it is only available from API level 26 and up. Perhaps a compat library will appear soon.
https://developer.android.com/reference/android/graphics/Typeface.Builder.html
Typeface.Builder buidler = new Typeface.Builder("your_font_file.ttf");
builder.setFontVariationSettings("'wght' 700, 'slnt' 20, 'ital' 1");
builder.setWeight(700); // Tell the system that this is a bold font.
builder.setItalic(true); // Tell the system that this is an italic style font.
Typeface typeface = builder.build();
I struggled with several weights of a font: bold, semibold, medium, regular.
For me it finally worked when I created a .xml file for each weight, with normal and italic, and then referencing them in the layout or style with both android:fontFamily:
and fontFamily:
. The latter was important, cause otherwise it would only work in very high API levels.
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<font android:font="@font/internal_inter_bold"
android:fontStyle="normal"
android:fontWeight="700"
app:font="@font/internal_inter_bold"
app:fontStyle="normal"
app:fontWeight="700" />
<font android:font="@font/internal_inter_bold_italic"
android:fontStyle="italic"
android:fontWeight="700"
app:font="@font/internal_inter_bold_italic"
app:fontStyle="italic"
app:fontWeight="700" />
</font-family>
<style name="numbers_large">
<item name="android:textSize">32sp</item>
<item name="android:fontFamily">@font/inter_bold</item>
<item name="fontFamily">@font/inter_bold</item>
</style>
This works even in Android 5.0, didn't test it for lower ones.
So basically create a font.xml file for each font weight, use both app: and android: prefixes, and then reference them with both prefixes.
Since the textFontWeight
attribute is API level 28 and higher a workaround for supporting older devices is to create a separate fontFamily for each font-weight and reference the fontFamily from the View.
res/layout/your_layout.xml
<TextView
...
android:fontFamily="@font/fontFamily_your_font_demibold
/>
res/font/fontFamily_your_font_demibold.xml
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:font="@font/your_font_demibold"
app:fontStyle="normal"
app:fontWeight="600" />
</font-family>
res/font/fontFamily_your_font_bold.xml
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:font="@font/your_font_bold"
app:fontStyle="normal"
app:fontWeight="800" />
</font-family>
Step 1: Find or Download your font, let's say cavier_dream
Step 2: Right-click on the res folder and create the font resource folder inside the res folder
Step 3: Right-click on font folder and create a font resource file, let's say app_font.xml
Step 4: Open the app_font.xml file and modify as follows
<?xml version="1.0" encoding="utf-8"?>
<font
android:font="@font/cavier_dream"
android:fontWeight="400"
android:fontStyle="normal"
app:fontWeight="400"
app:fontStyle="normal"
app:font="@font/cavier_dream"/>
Usage:
For global usage across the application go to the styles.xml and inside the theme, create a new item as follow
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 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/app_font</item>
</style>
And for local usage simply use the fontFamily attribute and set the app_font as value.
Happy coding:)
here how you can user different font's weights in android studio
app/src/main/res/layout/you_awesome_layout.xml
Design tab
TextView
and select View all attributes
at the bottom of the right menufontFamily
dropdown and select More Fonts…
YouFontFamilyName
Regular/Bold/Semibold/Black/WhateverStyleYouHaveThere
Voila, I think this is the only way to achieve what you want