Set font for all textViews in activity?
Solution 1
Solution1:: Just call these method by passing parent view as argument.
private void overrideFonts(final Context context, final View v) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
} else if (v instanceof TextView ) {
((TextView) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "font.ttf"));
}
} catch (Exception e) {
}
}
Solution2:: you can subclass the TextView class with your custom font and use it instead of textview.
public class MyTextView extends TextView {
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyTextView(Context context) {
super(context);
init();
}
private void init() {
if (!isInEditMode()) {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font.ttf");
setTypeface(tf);
}
}
}
Solution 2
The one from my personal collection:
private void setFontForContainer(ViewGroup contentLayout) {
for (int i=0; i < contentLayout.getChildCount(); i++) {
View view = contentLayout.getChildAt(i);
if (view instanceof TextView)
((TextView)view).setTypeface(yourFont);
else if (view instanceof ViewGroup)
setFontForContainer((ViewGroup) view);
}
}
Solution 3
If you are looking for a more general programatic solution, I created a static class that can be used to set the Typeface of an entire view (Activity UI). Note that I am working with Mono (C#) but you can implement it easily using Java.
You can pass this class a layout or a specific view that you want to customize. If you want to be super efficient you could implement it using the Singleton pattern.
public static class AndroidTypefaceUtility
{
static AndroidTypefaceUtility()
{
}
//Refer to the code block beneath this one, to see how to create a typeface.
public static void SetTypefaceOfView(View view, Typeface customTypeface)
{
if (customTypeface != null && view != null)
{
try
{
if (view is TextView)
(view as TextView).Typeface = customTypeface;
else if (view is Button)
(view as Button).Typeface = customTypeface;
else if (view is EditText)
(view as EditText).Typeface = customTypeface;
else if (view is ViewGroup)
SetTypefaceOfViewGroup((view as ViewGroup), customTypeface);
else
Console.Error.WriteLine("AndroidTypefaceUtility: {0} is type of {1} and does not have a typeface property", view.Id, typeof(View));
}
catch (Exception ex)
{
Console.Error.WriteLine("AndroidTypefaceUtility threw:\n{0}\n{1}", ex.GetType(), ex.StackTrace);
throw ex;
}
}
else
{
Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / view parameter should not be null");
}
}
public static void SetTypefaceOfViewGroup(ViewGroup layout, Typeface customTypeface)
{
if (customTypeface != null && layout != null)
{
for (int i = 0; i < layout.ChildCount; i++)
{
SetTypefaceOfView(layout.GetChildAt(i), customTypeface);
}
}
else
{
Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / layout parameter should not be null");
}
}
}
In your activity you will need to create a Typeface object. I create mine in the OnCreate() using a .ttf file placed in my Resources/Assets/ directory. Make sure that the file is marked as an Android Asset in its' properties.
protected override void OnCreate(Bundle bundle)
{
...
LinearLayout rootLayout = (LinearLayout)FindViewById<LinearLayout>(Resource.Id.signInView_LinearLayout);
Typeface allerTypeface = Typeface.CreateFromAsset(base.Assets,"Aller_Rg.ttf");
AndroidTypefaceUtility.SetTypefaceOfViewGroup(rootLayout, allerTypeface);
}
Solution 4
Extending Agarwal's answer... you can set regular, bold, italic, etc by switching the style of your TextView.
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;
public class TextViewAsap extends TextView {
public TextViewAsap(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public TextViewAsap(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextViewAsap(Context context) {
super(context);
init();
}
private void init() {
if (!isInEditMode()) {
Typeface tf = Typeface.DEFAULT;
switch (getTypeface().getStyle()) {
case Typeface.BOLD:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Bold.ttf");
break;
case Typeface.ITALIC:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
break;
case Typeface.BOLD_ITALIC:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
break;
default:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Regular.ttf");
break;
}
setTypeface(tf);
}
}
}
You can create your Assets folder like this:
And your Assets folder should look like this:
Finally your TextView in xml should be a view of type TextViewAsap. Now it can use any style you coded...
<com.example.project.TextViewAsap
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example Text"
android:textStyle="bold"/>
Solution 5
Best answers
1. Setting custom font for one textView
Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "Fonts/FontName.ttf");
textView.setTypeface (typeface);
2. Setting custom font for all textViews
Create a JavaClass like below
public class CustomFont extends android.support.v7.widget.AppCompatTextView {
public CustomFont(Context context) {
super(context);
init();
}
public CustomFont(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomFont(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/FontName.ttf");
setTypeface(tf);
}
}
And in your xml page
<packageName.javaClassName>
...
/>
=>
<com.mahdi.hossaini.app1.CustomFont
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="KEEP IT SIMPLE"
android:textAlignment="center" />
William L.
I've dabbled in Java and Android, I'm pretty proficient in PHP, JavaScript, HTML, SQL and a few others.
Updated on March 26, 2020Comments
-
William L. over 4 years
Is it possible to set the font for all the TextViews in a activity? I can set the font for a single textView by using:
TextView tv=(TextView)findViewById(R.id.textView1); Typeface face=Typeface.createFromAsset(getAssets(), "font.ttf"); tv.setTypeface(face);
But I would like to change all the textViews at once, instead of setting it manually for every textView, any info would be appreciated!