2012-01-09 10 views
43

C'è un modo per aggiungere caratteri personalizzati in Temi in Android?Aggiunta di caratteri personalizzati al tema in Android

Ho letto Quick Tip: Customize Android Fonts, ma qui dobbiamo programmare in modo metrico un carattere personalizzato in testo.

TextView txt = (TextView) findViewById(R.id.custom_font); 
Typeface font = Typeface.createFromAsset(getAssets(), "Chantelli_Antiqua.ttf"); 
txt.setTypeface(font); 

Ma io voglio impostare il carattere personalizzato per stile/tema.

risposta

-1

Spero che questo sia ciò che intendevi, ma se così non fosse dovrebbe essere comunque un buon riferimento per gli altri.

** Nota: I font possono essere trovati computer/Disco locale (C:)/Windows/Fonts **

Copiare il tipo di carattere che si desidera utilizzare nella cartella Fonts sopra e incollarlo in un nuovo cartella creata nella cartella delle risorse in Eclipse.

private void initTypeFace() 
    { 
     TypeFace tf = TypeFace.createFromAsset(getAsset(), 
         "Chantelli Antiqua.ttf"); 

     TextView txt = (TextView) findViewById(R.id.custom_font); 

     txt.setTypeface(tf); 
     example_button1.setTypeface(tf); 
     example_button2.setTypeface(tf); 
    } 
0

Penso che la risposta alla tua domanda possa essere personalizzata con TextView con parametro XML aggiuntivo, che puoi includere nei tuoi temi.

È possibile analizzare questo valore nel costruttore TextView (contesto Context, AttributeSet attrs) per inizializzarlo. Controlla il collegamento this ad esempio per la definizione di attrs personalizzati per le tue visualizzazioni e inizializzandoli.

12

Penso che questo sia duplicato di this question e this one.

nelle mie attività in fase di esecuzione, io uso qualcosa di simile:

FontUtils.setCustomFont(findViewById(R.id.top_view), getAssets()); 

In XML:

 <TextView 
      android:id="@+id/my_label" 
      android:tag="condensed" 
      android:text="@string/label" 
      ... /> 

Quindi, in teoria è possibile creare lo stile e utilizzarlo insieme con il codice di FontUtils/runtime.

<style name="roboto_condensed"> 
    <item name="android:tag">condensed,your-own-css-like-language-here</item> 
</style> 

FontUtils classe:

public class FontUtils { 
    private static Typeface normal; 

    private static Typeface bold; 

    private static Typeface condensed; 

    private static Typeface light; 

    private static void processsViewGroup(ViewGroup v, final int len) { 

    for (int i = 0; i < len; i++) { 
     final View c = v.getChildAt(i); 
     if (c instanceof TextView) { 
     setCustomFont((TextView) c); 
     } else if (c instanceof ViewGroup) { 
     setCustomFont((ViewGroup) c); 
     } 
    } 
    } 

    private static void setCustomFont(TextView c) { 
    Object tag = c.getTag(); 
    if (tag instanceof String) { 
     if (((String) tag).contains("bold")) { 
     c.setTypeface(bold); 
     return; 
     } 
     if (((String) tag).contains("condensed")) { 
     c.setTypeface(condensed); 
     return; 
     } 
     if (((String) tag).contains("light")) { 
     c.setTypeface(light); 
     return; 
     } 
    } 
    c.setTypeface(normal); 
    } 

    public static void setCustomFont(View topView, AssetManager assetsManager) { 
    if (normal == null || bold == null || condensed == null || light == null) { 
     normal = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Regular.ttf"); 
     bold = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Bold.ttf"); 
     condensed = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Condensed.ttf"); 
     light = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Light.ttf"); 
    } 

    if (topView instanceof ViewGroup) { 
     setCustomFont((ViewGroup) topView); 
    } else if (topView instanceof TextView) { 
     setCustomFont((TextView) topView); 
    } 
    } 

    private static void setCustomFont(ViewGroup v) { 
    final int len = v.getChildCount(); 
    processsViewGroup(v, len); 
    } 
} 
3

È possibile includere il tipo di carattere personalizzato nella cartella beni e prelevare da lì.

dichiarare il Typefaces come:

Typeface helveticaBold; 
Typeface helveticaRegular; 

in onCreate() scrivere il codice seguente:

helveticaBold = Typeface.createFromAsset(getAssets(), "helvetica_bold.ttf"); 
helveticaRegular = Typeface.createFromAsset(getAssets(), "helvetica_regular.ttf"); 

infine, impostare il carattere del testo di TextView o EditText come:

editText.setTypeface(helveticaRegular); 

questo è tutto ...

+0

sì, ma non quello che sta chiedendo – user1010160

4

Usando il mio CustomTextView si specifica un nome di file di font nella cartella assets direttamente nel file di layout XML.

La mia risposta è here

19

Purtroppo, Android non prevede il modo rapido, semplice e pulito che stai cercando di cambiare il tipo di carattere per l'intera applicazione. Ma di recente ho esaminato la questione e creato alcuni strumenti che consentono di modificare il carattere senza alcuna codifica (è possibile farlo tutto tramite xml, stili e persino aspetti del testo). Si basano su soluzioni simili come quelle che vedi nelle altre risposte qui, ma consentono una maggiore flessibilità. Puoi leggere tutto al riguardo su this blog e vedere il progetto github here.

Ecco un esempio di come applicare questi strumenti. Inserisci tutti i tuoi font in assets/fonts/. Quindi, dichiara quei tipi di carattere in un file xml (ad esempio res/xml/fonts.xml) e carica questo file all'inizio della tua app con TypefaceManager.initialize(this, R.xml.fonts); (ad es. Nel onCreate della tua classe Application). Il file XML è simile al seguente:

<?xml version="1.0" encoding="utf-8"?> 
<familyset> 

    <!-- Some Font. Can be referenced with 'someFont' or 'aspergit' --> 
    <family> 
     <nameset> 
      <name>aspergit</name> 
      <name>someFont</name> 
     </nameset> 
     <fileset> 
      <file>Aspergit.ttf</file> 
      <file>Aspergit Bold.ttf</file> 
      <file>Aspergit Italic.ttf</file> 
      <file>Aspergit Bold Italic.ttf</file> 
     </fileset> 
    </family> 

    <!-- Another Font. Can be referenced with 'anotherFont' or 'bodoni' --> 
    <family> 
     <nameset> 
      <name>bodoni</name> 
      <name>anotherFont</name> 
     </nameset> 
     <fileset> 
      <file>BodoniFLF-Roman.ttf</file> 
      <file>BodoniFLF-Bold.ttf</file> 
     </fileset> 
    </family> 

</familyset> 

Ora è possibile utilizzare questi font nel vostro stile o XML (a patto di utilizzare gli strumenti che ho citato sopra), impostando l'attributo flFont nel TextView personalizzato com.innovattic.font.FontTextView nel layout xml . Qui di seguito potete vedere come è possibile applicare un tipo di carattere a tutti i testi in tutta la tua app, semplicemente modificando res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> 

    <!-- Application theme --> 
    <!-- Use a different parent if you don't want Holo Light --> 
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 
     <item name="android:textViewStyle">@style/MyTextViewStyle</item> 
    </style> 

    <!-- Style to use for ALL text views (including FontTextView) --> 
    <!-- Use a different parent if you don't want Holo Light --> 
    <style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView"> 
     <item name="android:textAppearance">@style/MyTextAppearance</item> 
    </style> 

    <!-- Text appearance to use for ALL text views (including FontTextView) --> 
    <!-- Use a different parent if you don't want Holo Light --> 
    <style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo"> 
     <!-- Alternatively, reference this font with the name "aspergit" --> 
     <!-- Note that only our own TextView's will use the font attribute --> 
     <item name="flFont">someFont</item> 
     <item name="android:textStyle">bold|italic</item> 
    </style> 

    <!-- Alternative style, maybe for some other widget --> 
    <style name="StylishFont"> 
     <item name="flFont">anotherFont</item> 
     <item name="android:textStyle">normal</item> 
    </style> 

</resources> 

Con l'accompagnamento res/layout/layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <!-- This text view is styled with the app theme --> 
    <com.innovattic.font.FontTextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This uses my font in bold italic style" /> 

    <!-- This text view is styled here and overrides the app theme --> 
    <com.innovattic.font.FontTextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:flFont="anotherFont" 
     android:textStyle="normal" 
     android:text="This uses another font in normal style" /> 

    <!-- This text view is styled with a style and overrides the app theme --> 
    <com.innovattic.font.FontTextView 
     style="@style/StylishFont" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This also uses another font in normal style" /> 

</LinearLayout> 

Non dimenticare di applicare il tema nel tuo manifest Android.

+0

grazie! GRANDE articolo .. –

+0

Dato che stai usando anche il codice java, possiamo farlo in modo più semplice. –

+0

Questo dovrebbe essere nativo in Android – Zach

Problemi correlati