2016-03-22 23 views
2

私のアプリに動的にフォントを追加しようとしています。私は、私のサーバーで指定されたフォントに従って、実行時に自分のアプリケーションのすべてのTextViewのフォントを変更したいと思います。フォント(ttfファイルなど)をダウンロードして実行時に使用する方法はありますか?ランタイムにフォントressourceを追加

ありがとうございます。

答えて

1

超クールな問題ですので、私は間違いなくそれが可能だと思うので、これを行って正しい方向に向けるつもりです。

まず、私が考えているカップルの作品があります。

  1. フォント
  2. をダウンロードするための何かがアクティブなフォント
  3. にフォントISNそれに対処するためにいくつかの方法を保持するために何か「利用できるトン(または、より簡単に、フォントが利用できるようになるまで何も表示延期)
  4. カスタムのTextViewアクティブなフォントを使用する

私は、ダウンロード部分が実際にフォントを使用する方法の範囲外で、ファイルをダウンロードする方法がたくさんあると思うので、#1をあなたに任せます。

public class FontHolder { 
    private static FontHolder instance; 
    public static FontHolder getInstance(Context context){ 
     if(instance == null) 
      instance = new FontHolder(context); 

     return instance; 
    } 

    private static final String PREF_TABLE = "font_prefs" 
    private static final String ACTIVE_FONT_PREF = "active_font_file"; 
    private static final String DEFAULT_PREF_ASSET = "fonts/default_font.ttf"; 

    private Context context; 
    private Typeface activeTypeFace; 

    protected FontHolder(Context context){ 
     this.context = context.getApplicationContext(); 

     String activeFilePath = getSavedActiveFont(); 
     this.activeTypeFace = activeFilePath == null 
       ? Typeface.createFromAssets(context.getResources().getAssets() 
       : Typeface.createFromFile(new File(activeFilePath)); 
    } 

    private String getSavedActiveFont(){ 
     return context.getSharedPreferences(PREF_TABLE, 0) 
      .getString(ACTIVE_FONT_PREF, null); 
    } 

    public void setActiveFont(File activeFontFile){ 
     this.activeFont = Typeface.createFromFile(activeFontFile); 

     context.getSharedPreferences(PREF_TABLE, 0) 
      .edit() 
      .putString(ACTIVE_FONT_PREF, activeFontFile.getAbsolutePath()) 
      .commit(); 
    } 

    public Typeface getActiveFont(){ 
     return activeFont; 
    } 
} 

ますよう:

は、#2のために、我々は(我々はまた、それを使用したいすべてのビューのためにそれを再作成していないこの方法で)アクティブな書体への参照を保持するためにシングルトンを使用することができますそれを使ってインスタンスのアクティブなフォントを簡単に変更することができ、また、セッションを超えて持続するように環境設定のファイルへの参照を保存することができます。異なるパターン(太字、斜体など)を追加する場合は、テンプレートを変更できます。

また、現在保存されていないときに、書体をデフォルトにするアセットファイルへの参照があります。

今、私たちは、この書体を使用するためにカスタムのTextViewを必要とする:戻って、今

<com.package.DynamicFontTextView 
.... 
/> 

public class DynamicFontTextView extends TextView { 

    public DynamicFontTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     updateActiveFont(); 
    } 

    public DynamicFontTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     updateActiveFont(); 
    } 

    public DynamicFontTextView(Context context) { 
     super(context); 
     updateActiveFont(); 
    } 

    @Override 
    public void setTypeface(Typeface tf, int style) { 
     // if(style == Typeface.BOLD) <-- Something for later 
     super.setTypeface(FontHolder.getInstance().getActiveFont()); 
    } 

    public void updateActiveFont(){ 
     super.setTypeface(FontHolder.getInstance().getActiveFont()); 
    } 
} 

今、あなたのXMLファイルでは、あなたのようなものを使用してDynamicFontTextViewを使用することができますパート3へ。フォントが利用できない場合は、ダウンロードする必要があります。ちょうどスプラッシュページを作成し、フォントがダウンロードされるまで、ユーザが継続することはできません。

A. Prevent them from getting to a screen where the custom font would ever be used. 
B. Render with a default font, and then update the Views once the font is available 

だが、それは比較的簡単ですので、この場合には一緒に行きましょう:それはダウンロードしている間、あなたは2の選択肢があります。

また、スプラッシュページはこの範囲を少し超えていますが、これはあなたのタスクを達成する方法の正しい方向を指し示すはずです。

関連する問題