¿Cómo configurar una fuente personalizada en el título de la barra de acciones?

Resuelto asked hace 54 años • 17 respuestas

¿Cómo (si es posible) podría configurar una fuente personalizada en el texto del título de la ActionBar (solo, no en el texto de la pestaña) con una fuente en mi carpeta de activos? No quiero usar la opción android:logo.

 avatar Jan 01 '70 08:01
Aceptado

Puedes hacer esto usando una TypefaceSpanclase personalizada. Es superior al customViewenfoque indicado anteriormente porque no se rompe al usar otros elementos de la barra de acción, como expandir vistas de acción.

El uso de dicha clase sería algo como esto:

SpannableString s = new SpannableString("My Title");
s.setSpan(new TypefaceSpan(this, "MyTypeface.otf"), 0, s.length(),
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getActionBar();
actionBar.setTitle(s);

A la clase personalizada TypefaceSpanse le pasa el contexto de su actividad y el nombre de un tipo de letra en su assets/fontsdirectorio. Carga el archivo y almacena en caché una nueva Typefaceinstancia en la memoria. La implementación completa de TypefaceSpanes sorprendentemente simple:

/**
 * Style a {@link Spannable} with a custom {@link Typeface}.
 * 
 * @author Tristan Waddington
 */
public class TypefaceSpan extends MetricAffectingSpan {
      /** An <code>LruCache</code> for previously loaded typefaces. */
    private static LruCache<String, Typeface> sTypefaceCache =
            new LruCache<String, Typeface>(12);

    private Typeface mTypeface;

    /**
     * Load the {@link Typeface} and apply to a {@link Spannable}.
     */
    public TypefaceSpan(Context context, String typefaceName) {
        mTypeface = sTypefaceCache.get(typefaceName);

        if (mTypeface == null) {
            mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                    .getAssets(), String.format("fonts/%s", typefaceName));

            // Cache the loaded Typeface
            sTypefaceCache.put(typefaceName, mTypeface);
        }
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

Simplemente copie la clase anterior en su proyecto e impleméntela en el onCreatemétodo de su actividad como se muestra arriba.

twaddington avatar Mar 03 '2013 00:03 twaddington

Estoy de acuerdo en que esto no es completamente compatible, pero esto es lo que hice. Puede utilizar una vista personalizada para su barra de acciones (se mostrará entre su icono y sus elementos de acción). Estoy usando una vista personalizada y tengo el título nativo deshabilitado. Todas mis actividades heredan de una única actividad, que tiene este código en onCreate:

this.getActionBar().setDisplayShowCustomEnabled(true);
this.getActionBar().setDisplayShowTitleEnabled(false);

LayoutInflater inflator = LayoutInflater.from(this);
View v = inflator.inflate(R.layout.titleview, null);

//if you need to customize anything else about the text, do it here.
//I'm using a custom TextView with a custom font in my layout xml so all I need to do is set title
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());

//assign the view to the actionbar
this.getActionBar().setCustomView(v);

Y mi diseño xml (R.layout.titleview en el código anterior) se ve así:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

<com.your.package.CustomTextView
        android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:textSize="20dp"
            android:maxLines="1"
            android:ellipsize="end"
            android:text="" />
</RelativeLayout>
Sam Dozor avatar Jan 05 '2012 19:01 Sam Dozor
int titleId = getResources().getIdentifier("action_bar_title", "id",
            "android");
    TextView yourTextView = (TextView) findViewById(titleId);
    yourTextView.setTextColor(getResources().getColor(R.color.black));
    yourTextView.setTypeface(face);
Digit avatar Dec 11 '2013 11:12 Digit