1. 程式人生 > >Android 中全域性更換字型的方法

Android 中全域性更換字型的方法

在我們開發Android程式的時候通常會遇到更改全域性字型的需求,我目前能想到的解決方案有三種,下面我們來進行逐一分析:

第一種方式就是自定義控制元件,毫無疑問這個一定能解決我們的問題,只需要把我們之前用的控制元件換成我們自定義的控制元件就好,缺點是如果是多種控制元件我們就要自定義多種相對應的View,太過麻煩,工作量太大

第二種是利用遞迴的思想遍歷RootView 中的所有View進行判斷並進行字型的更改,缺點是有損效能

第三種方法是利用setFactory方法來更換字型,這個也是我想主要說的,這裡我們需要字型.ttf檔案,如圖:


主要程式碼如下:

  1. package com.example.mac.allchangetextsizetest;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.content.res.Configuration;  
  6. import android.graphics.Typeface;  
  7. import android.support.v4.view.LayoutInflaterCompat;  
  8. import android.support.v4.view.LayoutInflaterFactory;  
  9. import android.support.v7.app.AppCompatActivity;  
  10. import android.os.Bundle;  
  11. import android.support.v7.app.AppCompatDelegate;  
  12. import android.util.AttributeSet;  
  13. import android.util.DisplayMetrics;  
  14. import android.view.LayoutInflater;  
  15. import android.view.View;  
  16. import android.widget.Button;  
  17. import android.widget.EditText;  
  18. import android.widget.TextView;  
  19. publicclass MainActivity extends AppCompatActivity {  
  20.     publicstatic Typeface typeface;  
  21.     publicstatic Typeface typeface1;  
  22.     @Override
  23.     protectedvoid onCreate(Bundle savedInstanceState) {  
  24.         if (typeface == null)  {  
  25.             typeface = Typeface.createFromAsset(getAssets(), "Arial.ttf");  
  26.         }  
  27.         if (typeface1 == null {  
  28.             typeface1 = Typeface.createFromAsset(getAssets(), "ARIALNI.TTF");  
  29.         }  
  30.         LayoutInflaterCompat.setFactory(LayoutInflater.from(this), new LayoutInflaterFactory()  
  31.         {  
  32.             @Override
  33.             public View onCreateView(View parent, String name, Context context, AttributeSet attrs)  
  34.             {  
  35.                 AppCompatDelegate delegate = getDelegate();  
  36.                 View view = delegate.createView(parent, name, context, attrs);  
  37.                 if ( view!= null && (view instanceof TextView))   {  
  38.                     ((TextView) view).setTypeface(typeface1);  
  39.                 }  
  40.                 if(view!=null && (view instanceof EditText)) {  
  41.                     ((EditText) view).setTypeface(typeface);  
  42.                 }  
  43.                 return view;  
  44.             }  
  45.         });  
  46.         super.onCreate(savedInstanceState);  
  47.         setContentView(R.layout.activity_main);  
  48.         Button button = (Button)findViewById(R.id.button);  
  49.         button.setOnClickListener(new View.OnClickListener() {  
  50.             @Override
  51.             publicvoid onClick(View v) {  
  52.                // changeTextSize(MainActivity.this,2);
  53.                 finish();  
  54.                 Intent intent = new Intent(MainActivity.this, MainActivity.class);  
  55.                 startActivity(intent);  
  56.             }  
  57.         });  
  58.     }  
這樣只要我們的Activity 繼承自上面的Activity那麼其中的TextView 和 EditText 都會變成我們設定成的字型

效果圖如下:



這樣 我們的變換字型就OK了