Is it possible to set a custom font for entire of application?

后端 未结 25 2691
日久生厌
日久生厌 2020-11-22 02:44

I need to use certain font for my entire application. I have .ttf file for the same. Is it possible to set this as default font, at application start up and then use it else

相关标签:
25条回答
  • 2020-11-22 03:05

    You can set custom fonts for every layout one by one ,with just one function call from every layout by passing its root View.First ,create a singelton approach for accessing font object like this

     public class Font {
        private static Font font;
        public Typeface ROBO_LIGHT;
    
        private Font() {
    
        }
    
        public static Font getInstance(Context context) {
            if (font == null) {
                font = new Font();
                font.init(context);
            }
            return font;
    
        }
    
        public void init(Context context) {
    
            ROBO_LIGHT = Typeface.createFromAsset(context.getAssets(),
                    "Roboto-Light.ttf");
        }
    
    }
    

    You can define different fonts in above class, Now Define a font Helper class that will apply fonts :

       public class FontHelper {
    
        private static Font font;
    
        public static void applyFont(View parentView, Context context) {
    
            font = Font.getInstance(context);
    
            apply((ViewGroup)parentView);
    
        }
    
        private static void apply(ViewGroup parentView) {
            for (int i = 0; i < parentView.getChildCount(); i++) {
    
                View view = parentView.getChildAt(i);
    
    //You can add any view element here on which you want to apply font 
    
                if (view instanceof EditText) {
    
                    ((EditText) view).setTypeface(font.ROBO_LIGHT);
    
                }
                if (view instanceof TextView) {
    
                    ((TextView) view).setTypeface(font.ROBO_LIGHT);
    
                }
    
                else if (view instanceof ViewGroup
                        && ((ViewGroup) view).getChildCount() > 0) {
                    apply((ViewGroup) view);
                }
    
            }
    
        }
    
    }
    

    In the above code, I am applying fonts on textView and EditText only , you can apply fonts on other view elements as well similarly.You just need to pass the id of your root View group to the above apply font method. for example your layout is :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/mainParent"
        tools:context="${relativePackage}.${activityClass}" >
    
        <RelativeLayout
            android:id="@+id/mainContainer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/homeFooter"
            android:layout_below="@+id/edit" >
    
            <ImageView
                android:id="@+id/PreviewImg"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/abc_list_longpressed_holo"
                android:visibility="gone" />
    
            <RelativeLayout
                android:id="@+id/visibilityLayer"
                android:layout_width="match_parent"
                android:layout_height="fill_parent" >
    
                <ImageView
                    android:id="@+id/UseCamera"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:layout_centerHorizontal="true"
                    android:src="@drawable/camera" />
    
                <TextView
                    android:id="@+id/tvOR"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/UseCamera"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="20dp"
                    android:text="OR"
                    android:textSize="30dp" />
    
                <TextView
                    android:id="@+id/tvAND"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="20dp"
                    android:text="OR"
                    android:textSize="30dp" />
    
    </RelativeLayout>
    

    In the Above Layout the root parent id is "Main Parent " now lets apply font

    public class MainActivity extends BaseFragmentActivity {
    
        private EditText etName;
        private EditText etPassword;
        private TextView tvTitle;
        public static boolean isHome = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
           Font font=Font.getInstance(getApplicationContext());
            FontHelper.applyFont(findViewById(R.id.mainParent),          getApplicationContext());
       }    
    }
    

    Cheers :)

    0 讨论(0)
  • 2020-11-22 03:06

    Yes, its possible to set the font to the entire application.

    The easiest way to accomplish this is to package the desired font(s) with your application.

    To do this, simply create an assets/ folder in the project root, and put your fonts (in TrueType, or TTF, form) in the assets.

    You might, for example, create assets/fonts/ and put your TTF files in there.

    public class FontSampler extends Activity {
    @Override
    public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    TextView tv=(TextView)findViewById(R.id.custom);
    
    Typeface face=Typeface.createFromAsset(getAssets(), "fonts/HandmadeTypewriter.ttf");
    tv.setTypeface(face);
    }
    }
    
    0 讨论(0)
  • 2020-11-22 03:07

    I would like to improve weston's and Roger Huang's answers for over API 21 Android lollipop with theme "Theme.AppCompat".

    Below Android 4.4

    <resources>
        <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
        </style>
    
       <!-- Application theme. -->
       <style name="AppTheme" parent="AppBaseTheme">
           <item name="android:typeface">monospace</item>
       </style>
    </resources>
    

    Over(equal) API 5.0

    <resources>
        <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
        </style>
    
       <!-- Application theme. -->
       <style name="AppTheme" parent="AppBaseTheme">
           <item name="android:textAppearance">@style/CustomTextAppearance</item>
       </style>
    
       <style name="CustomTextAppearance">
           <item name="android:typeface">monospace</item>
       </style>
    </resources>
    

    And the FontsOverride util file is same as what in weston's answer. I have tested in these phones:

    Nexus 5(android 5.1 Primary Android System)

    ZTE V5(android 5.1 CM12.1)

    XIAOMI note(android 4.4 MIUI6)

    HUAWEI C8850(android 2.3.5 UNKNOWN)

    0 讨论(0)
  • 2020-11-22 03:07

    in api 26 with build.gradle 3.0.0 and higher you can create a font directory in res and use this line in your style

    <item name="android:fontFamily">@font/your_font</item>
    

    for change build.gradle use this in your build.gradle dependecies

    classpath 'com.android.tools.build:gradle:3.0.0'
    
    0 讨论(0)
  • 2020-11-22 03:07

    Calligraphy works pretty well, but it is not suitable for me, since it does not support different weights (bold, italic, etc) for a font-family.

    So I tried Fontain, which allows you to define custom Views and apply them custom font families.

    in order to use Fontain, you should add the following to your app module build.gradle:

    compile 'com.scopely:fontain:1.0.0'
    

    Then, instead of using regular TextView, you should use FontTextView

    Example of FontTextView with uppercase and bold content:

     <com.scopely.fontain.views.FontTextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/black"
                android:textColor="@android:color/white"
                android:textSize="11dp"
                android:gravity="center"
                android:id="@+id/tv1"
                app:font_family="myCustomFont"
                app:caps_mode="characters"
                app:font_weight="BOLD"/>
    
    0 讨论(0)
  • 2020-11-22 03:07

    Since the release of Android Oreo and its support library (26.0.0) you can do this easily. Refer to this answer in another question.

    Basically your final style will look like this:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       <item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 -->
    </style>
    
    0 讨论(0)
提交回复
热议问题