Fuentes personalizadas en Android de una manera bien.
¿Estás harto de las vistas personalizadas para establecer fuentes? ¿O atravesar el ViewTree para encontrar textViews? Sí, yo también.
Incluya la descarga de dependencia (.aar):
dependencies {
compile ' uk.co.chrisjenx:calligraphy:2.3.0 '
}
Agregue sus fuentes personalizadas a assets/
. Todas las definiciones de fuentes son relativas a esta ruta.
Suponiendo que está utilizando Gradle, debe crear el directorio de activos en src/main/
en su directorio de proyecto si aún no existe. Como es popular usar la compilación de proyectos múltiples con Gradle, la ruta suele ser app/src/main/assets/
, donde app
es el nombre del proyecto.
Puede considerar crear una fonts/
subdirectorio en el directorio de activos (como en ejemplos).
< TextView fontPath = " fonts/MyFont.ttf " />
Nota: El espacio de nombres faltante, esto es intencional.
Defina su fuente predeterminada utilizando CalligraphyConfig
, en su clase Application
en el método #onCreate()
.
@ Override
public void onCreate () {
super . onCreate ();
CalligraphyConfig . initDefault ( new CalligraphyConfig . Builder ()
. setDefaultFontPath ( "fonts/Roboto-RobotoRegular.ttf" )
. setFontAttrId ( R . attr . fontPath )
. build ()
);
//....
}
NOTA: No necesita definir CalligraphyConfig
, pero la biblioteca no aplicará una fuente predeterminada y usará el atributo predeterminado de R.attr.fontPath
.
Envuelva el contexto Activity
:
@ Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( CalligraphyContextWrapper . wrap ( newBase ));
}
¡Estás listo para ir!
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
fontPath = " fonts/Roboto-Bold.ttf " />
Nota: Popular IDE (Android Studio, IntelliJ) probablemente marcará esto como un error a pesar de ser correcto. Es posible que desee agregar tools:ignore="MissingPrefix"
a la vista en sí o en su grupo de vista principal para evitar esto. Deberá agregar el espacio de nombres de las herramientas para tener acceso a este atributo "ignorar". xmlns:tools=" http://schemas.android.com/tools"
. Consulte https://code.google.com/p/android/issues/detail?id=65176.
< style name = " TextAppearance.FontPath " parent = " android:TextAppearance " >
<!-- Custom Attr -->
< item name = " fontPath " >fonts/RobotoCondensed-Regular.ttf</ item >
</ style >
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
android : textAppearance = " @style/TextAppearance.FontPath " />
< style name = " TextViewCustomFont " >
< item name = " fontPath " >fonts/RobotoCondensed-Regular.ttf</ item >
</ style >
< style name = " AppTheme " parent = " android:Theme.Holo.Light.DarkActionBar " >
< item name = " android:textViewStyle " >@style/AppTheme.Widget.TextView</ item >
</ style >
< style name = " AppTheme.Widget " />
< style name = " AppTheme.Widget.TextView " parent = " android:Widget.Holo.Light.TextView " >
< item name = " fontPath " >fonts/Roboto-ThinItalic.ttf</ item >
</ style >
CalligraphyFactory
busca la fuente en un orden bastante específico, en su mayor parte es muy similar a cómo el marco de Android resuelve los atributos.
View
XML - ATtr definido aquí siempre tendrá prioridad.Style
XML - Atres definidos aquí se verifica a continuación.TextAppearance
XML - ATtr se verifica a continuación, la única advertencia para esto es si tiene una fuente definida en el Style
y un TextAttribute
definido en la View
El atributo Style
se elige primero.Theme
: si se define esto se usa.Default
: si se define en CalligraphyConfig
esto se usa de ninguno de los anteriores se encuentra o si uno de los anteriores devuelve una fuente no válida.Originalmente lo hicimos, pero estaba en conflicto con los usuarios que desean usar ese atributo, ahora debe definir un atributo personalizado.
Necesitábamos enviar una identificación personalizada con caligrafía para mejorar el flujo de inyección de fuente. Lamentablemente, esto significa que tiene que ser un aar
. Pero estás usando Gradle ahora de todos modos, ¿verdad?
Es posible usar múltiples tipos de letra dentro de TextView
, este no es un concepto nuevo para Android.
Esto podría lograrse usando algo como el siguiente código.
SpannableStringBuilder sBuilder = new SpannableStringBuilder ();
sBuilder . append ( "Hello!" ) // Bold this
. append ( "I use Calligraphy" ); // Default TextView font.
// Create the Typeface you want to apply to certain text
CalligraphyTypefaceSpan typefaceSpan = new CalligraphyTypefaceSpan ( TypefaceUtils . load ( getAssets (), "fonts/Roboto-Bold.ttf" ));
// Apply typeface to the Spannable 0 - 6 "Hello!" This can of course by dynamic.
sBuilder . setSpan ( typefaceSpan , 0 , 6 , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE );
setText ( sBuilder , TextView . BufferType . SPANNABLE );
Por supuesto, esto es solo un ejemplo. Su kilometraje puede variar.
Hasta donde sabemos (intente: grep -r -e "void set[^(]*(Typeface " <android source dir>
) Hay dos widgets estándar de Android que tienen múltiples métodos para establecer tipos de letra. Son:
Ambos tienen un método llamado setSwitchTypeface
que establece el tipo de letra dentro del interruptor (por ejemplo, encendido/apagado, sí/no). SetTypeface
establece el tipo de letra de la etiqueta. Deberá crear su propia subclase que anule setTypeface
y llame tanto super.setTypeface
como super.setSwitchTypeface
.
Esta biblioteca fue creada porque actualmente no es posible declarar una fuente personalizada en archivos XML en Android.
Si cree que esto debería ser posible, protagonizar este problema en el rastreador oficial de errores de Android.
Copyright 2013 Christopher Jenkins
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.