2012-01-21 13 views
17

z aplikacji muszę się rozwijać, Dostałem konkretnej czcionki, która ma wiele plików jak fontName-Regular, fontName-Bold, fontName-it. Muszę go używać we wszystkich odsłonach w aplikacji. Najpierw myślałem, że to łatwe zadanie. Spójrz SO i znalazłem bardzo ładny wątek: hereniestandardowe czcionki and Custom TextView na Androida

Więc najpierw zrobiłem tak:

public static 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(FONT_REGULAR); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     // ignore 
    } 
} 

I nazywa ta metoda podczas onCreate w mojej działalności. Każdy tekst w mojej aplikacji pokazywał tę czcionkę i chłopca, byłam szczęśliwa, bo tak łatwo mi było uciec. Dopóki nie dotarłem do ekranu, na którym wymagane były pewne wyskoki tekstu, Bold jako Style(). Wtedy zdałem sobie sprawę, że to rozwiązanie nie daje mi możliwości załadowania pliku Font-Bold .ttf z zasobów.

niż wyglądało dalej i zobaczyłem piękny zwyczaj TextView realizację, w tym samym SO pytanie:

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(); 
    } 

    public void init() { 

     Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf"); 
     setTypeface(tf ,1); 

    } 
    } 

To wygląda jeszcze lepiej. Moje pytanie brzmi: jak mogę wykryć na init(), jeśli moje sterowanie ma Styl ustawiony na pogrubienie, czy nie, więc mogę przypisać żądane TypeFace?

Dziękuję za poświęcony czas.

LE. Zgodnie z poniższym przykładzie, zaktualizowałem moją klasę jako:

public class MyTextView extends TextView { 

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_BOLD); 

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

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

    public MyTextView(Context context) { 
     super(context); 
    } 

    public void setTypeface(Typeface tf, int style) { 
     if (style == Typeface.BOLD) { 
      super.setTypeface(boldTypeface/*, -1*/); 
     } else { 
      super.setTypeface(normalTypeface/*, -1*/); 
     } 
    } 
} 

Dobrze jeśli debugować, aplikacja przechodzi w setTypeFace i wydaje się, aby zastosować pogrubienie jeden, ale w moim układzie nie widzę żadnej zmiany , nie pogrubiony. Bez względu na używaną czcionkę, nie dokonuję żadnych zmian w moim TextView i jest wyświetlana z domyślną czcionką Androida. Zastanawiam się dlaczego ?

Podsumowałem wszystko na blogu: here on my blog może to pomoże komuś.

+0

Thanks do szczegółowego pytania i opracowania oraz świetnego posta na blogu!Idealne dla mnie. Podklasowałem również Button dla tego samego wyniku. Moje jedyne zapytanie to w.r.t. efektywność wywoływania createFromAsset() _ everyry_ time. Czy byłoby lepiej załadować czcionki raz i zapisać je w klasie Application i uzyskać do nich dostęp z MyTextView.setTypeface()? –

+0

Dzięki za twoje słowa. Myślałem o tym również, ale nie testowałem, aby zobaczyć, jak działa. Powinno działać dobrze. W każdym razie nie widziałem żadnej kary za skuteczność z wieloma widokami na ekranie. – Alin

Odpowiedz

24

Konstruktor TextView wywołuje setTypeface(Typeface tf, int style) za pomocą parametru style pobranego z atrybutu XML android:textStyle. Tak więc, jeśli chcesz przechwycić to wezwanie, aby zmusić własne czcionki można zastąpić tę metodę następujące:

public void setTypeface(Typeface tf, int style) { 
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf"); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf"); 

    if (style == Typeface.BOLD) { 
     super.setTypeface(boldTypeface/*, -1*/); 
    } else { 
     super.setTypeface(normalTypeface/*, -1*/); 
    } 
} 
+0

Twoje rozwiązanie wydaje się słuszne, ale nie działa ... – Alin

+2

@Alin: Problem polegał na tym, że 'setTypeface()' jest wywoływane przez konstruktory przed utworzeniem 'Typeface'! Tak więc przenieś kreację 'Typeface's wewnątrz' setTypeface() ', a teraz zadziała! –

+0

Teraz działa, dzięki. Zrobiłeś mój dzień. – Alin

9

Można używać mojego CustomTextView który pozwala określić nazwę pliku czcionki w folderze assets:

https://github.com/mafshin/CustomTextView

i użycie jest bardzo proste:

<com.my.app.CustomTextView 
     xmlns:custom="http://schemas.android.com/apk/res/com.my.app"    
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test text" 
     android:id="@+id/testcustomview" 

     custom:fontAssetName="Politica XT.otf" 
     /> 
2

myślę, że lepiej jest creat e własny pakiet czcionek niestandardowych i importować je w projekcie, dzięki czemu można wykorzystać je później w przyszłości

package com.codeslips.utilities; 

    import android.content.Context; 
    import android.graphics.Typeface; 
    import android.util.AttributeSet; 
    import android.widget.TextView; 

    public class CustomTextView extends TextView { 

      public CustomTextView(Context context) 
       { super(context); setFont(); } 

      public CustomTextView(Context context,AttributeSet set) 
      { super(context,set); setFont(); } 

      public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
      { super(context,set,defaultStyle); setFont(); } 

      private void setFont() { 

      Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
      setTypeface(typeface); //function used to set font 

      } 
      } 

teraz użyć powyższej klasy w pliku XML mieć niestandardowe czcionki

<com.codeslips.utilities.CustomTextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:text="Upload Image" 
     android:paddingTop="10sp" 
     android:textSize="14sp" 
     android:layout_weight="0.7" 
     android:textColor="@android:color/white"/> 
Powiązane problemy