2012-01-21 14 views
5

¿hay alguna manera de cambiar las fuentes de todas las textviews en un diseño?cambiar la fuente de todas las textviews

actualmente estoy usando esto para cambiar las fuentes manualmente.

TextView txtAppName = (TextView) findViewById(R.id.txtAppName); 

Typeface tf = Typeface.createFromAsset(getAssets(), 
    "fonts/Existence-Light.otf"); 
txtAppName.setTypeface(tf); 

EDIT: He editado la pregunta de aclaración de mi problema.

+0

por lo que yo puedo ver que es "sólo" un TextView con id = "txtAppName" - nada de malo en eso o.O – yoshi

+0

Entonces, ¿solo quieres decir cómo cambiar las fuentes predeterminadas para todas las vistas de una aplicación? – Gangnus

Respuesta

0

Todas las fuentes por defecto del sistema se puede conseguir están en:

/Android res/valores/styles.xml

Puede cambiarlos sólo a través de las aplicaciones del sistema como Ajustes. Tal vez puedas llamar a alguna función del sistema que lo haga. Pero parece inprobable, ya que eso causaría problemas a todas las demás aplicaciones.

2

Los usuarios pueden cambiar la fuente predeterminada en la configuración, y se adhiere a todas las aplicaciones, por lo que si encuentra una manera de establecer esta configuración para el usuario, cambiará su fuente en todas sus aplicaciones.

Mi consejo sería crear una extracción para TextView y establecer su fuente solo una vez en esa clase.

+0

solo necesito cambiar la fuente de mi aplicación, como configurar todas las textviews en una determinada fuente otf, – Joe

+0

No he visto una configuración donde el usuario pueda cambiar la fuente predeterminada. Sin embargo, el usuario puede cambiar el tamaño de la fuente. –

+0

Así que debe seguir los consejos de Babibu y extender la clase TextView a, p. Ej. MyTextView donde se llama automáticamente el código de configuración de la fuente. – yoshi

3

Usted puede hacer su propio punto de vista que le fijará la fuente y utilizarlo

public class MyTextView extends TextView { 
    public MyTextView(Context context) { 
     super(context, attrs, defStyle); 
     setFont(context); 
    } 

    private void setFont(Context context) { 
     Typeface font = Typeface.createFromAsset(context.getAssets(), YOUR_FONT); 
     setTypeface(font); 
    } 
} 
+0

Estoy usando este código. ¿Hay alguna forma de comprobar si textStyle = bold para poder cambiar la fuente a MY_FONT_BOLD? – Joe

+0

puede usar el método setTypeface (font, MY_FONT_BOLD) – jimotozka

+0

no, lo que quiero decir es que si attr está configurado en negrita, intenté obtener el valor attr de la variable de cadena pero usando la función .contains, dará como resultado un forzar Cerrar – Joe

6

Tal vez un poco tarde para ti, pero para otros usuarios de Android que esto puede ser muy útil.

Desafortunadamente, Android no proporciona la manera rápida, fácil y limpia que está buscando para cambiar la fuente de toda su aplicación. Pero recientemente investigué este asunto y creé algunas herramientas que te permiten cambiar la fuente sin ningún tipo de codificación (puedes hacerlo a través de xml, estilos e incluso apariencias de texto). Puede leer todo al respecto en this blog, y ver el proyecto github here.

Aquí hay un ejemplo de cómo aplicar estas herramientas. Coloque todos sus archivos de fuentes en assets/fonts/. Luego, declare esas fuentes en un archivo xml y cargue este archivo temprano en su aplicación con TypefaceManager.initialize(this, R.xml.fonts); (por ejemplo, en la clase onCreate of your Application). El archivo XML es el siguiente:

<?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> 

ya se puede utilizar en su estilo o XML con el atributo flFont. Aquí es cómo aplicar la fuente de todos los textos en toda su aplicación:

<?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> 

</resources> 

Ahora usted puede hacer una layout.xml se parece a esto:

<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" > 

    <com.innovattic.font.FontTextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This uses my font in bold italic style" /> 

    <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" /> 

</LinearLayout> 

No se olvide de aplicar el tema en su Android manifiesto.

1

Si usted tiene su propia fuente personalizada, se debe añadir a assests-> carpeta de fuentes, que puede ser creada de la siguiente manera: enter image description here

A continuación, cree carpeta de fuentes & pegue el archivo "TTF" allí.

Entonces se necesita para iterar sobre todos los TextViews & conjunto de fuentes (mi es "fuentes/Qlassik_TB.ttf") programáticamente así:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // Your stuff here... 

    Typeface tf = Typeface.createFromAsset(this.getAssets(), "fonts/Qlassik_TB.ttf"); 

    ViewGroup myMostParentLayout = (ViewGroup) findViewById(R.id.frame_layout_most_parent); 

    setFontToAllChilds(myMostParentLayout, tf); 
} 

private void setFontToAllChilds(ViewGroup myMostParentLayout, Typeface tf) { 
    int childCount = myMostParentLayout.getChildCount(); 
    for (int i = 0; i < childCount; ++i) { 
     View child = myMostParentLayout.getChildAt(i); 

     if (child instanceof ViewGroup) 
      setFontToAllChilds((ViewGroup) child, tf); 
     else if (child instanceof TextView)     
      ((TextView) child).setTypeface(tf); 
} 

Y por último añadir un identificador a su WhateverLayout la mayoría de los padres:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/frame_layout_most_parent" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

que se utiliza aquí:

ViewGroup myMostParentLayout = (ViewGroup) findViewById(R.id.frame_layout_most_parent); 
Cuestiones relacionadas