269 votes

Comment définir une police personnalisée dans le titre ActionBar?

Comment (si possible) pourrais-je définir une police personnalisée dans un texte de titre ActionBar (uniquement - pas le texte de l'onglet) avec une police dans mon dossier d'actifs? Je ne veux pas utiliser l'option android: logo.

425voto

twaddington Points 6525

Vous pouvez le faire en utilisant une coutume TypefaceSpan classe. Il est supérieur à l' customView approche indiqué ci-dessus, car il ne se casse pas lors de l'utilisation d'autres éléments de la Barre d'Action, comme l'expansion de l'action.

L'utilisation d'une telle classe ressemblerait à quelque chose comme ceci:

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

La coutume TypefaceSpan classe est passé votre contexte d'Activité et le nom d'une police de caractères dans votre assets/fonts répertoire. Il charge le fichier de cache et un nouveau Typeface instance en mémoire. La mise en œuvre complète de l' TypefaceSpan est étonnamment 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);
    }
}

Il suffit de copier la classe ci-dessus dans votre projet et le mettre en œuvre dans votre activité, en onCreate méthode comme indiqué ci-dessus.

216voto

Sam Dozor Points 5709

Je suis d'accord que ce n'est pas complètement pris en charge, mais voici ce que j'ai fait. Vous pouvez utiliser une vue personnalisée pour votre barre d'action (elle s'affichera entre votre icône et vos actions). J'utilise une vue personnalisée et j'ai le titre natif désactivé. Toutes mes activités héritent d'une seule activité, qui a ce code dans 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);
 

Et ma mise en page xml (R.layout.titleview dans le code ci-dessus) ressemble à ceci:

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

153voto

Digit Points 1210
int titleId = getResources().getIdentifier("action_bar_title", "id",
            "android");
    TextView yourTextView = (TextView) findViewById(titleId);
    yourTextView.setTextColor(getResources().getColor(R.color.black));
    yourTextView.setTypeface(face);

14voto

thoutbeckers Points 201

La bibliothèque Calligraphie vous permet de définir une police personnalisée via le thème de l'application, qui s'applique également à la barre d'action.

 <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="android:fontFamily">fonts/Roboto-ThinItalic.ttf</item>
</style>
 

Tout ce qu'il faut pour activer la calligraphie, c'est de l'attacher à votre contexte d'activité:

 @Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}
 

Vous pouvez utiliser Calligraphie sur n'importe quelle vue prenant en charge android:fontFamily . Il prend également en charge l'utilisation de votre propre attribut personnalisé au lieu de android:fontFamily .

10voto

Bostone Points 14208

C'est un hack moche mais vous pouvez le faire comme ça (puisque action_bar_title est caché):

     try {
        Integer titleId = (Integer) Class.forName("com.android.internal.R$id")
                .getField("action_bar_title").get(null);
        TextView title = (TextView) getWindow().findViewById(titleId);
        // check for null and manipulate the title as see fit
    } catch (Exception e) {
        Log.e(TAG, "Failed to obtain action bar title reference");
    }
 

Ce code est pour les appareils post-GINGERBREAD, mais cela peut être facilement étendu pour fonctionner avec Sherlock Barre d'action

PS Basé sur le commentaire @pjv, il existe une meilleure façon de trouver l'identifiant du titre de la barre d'action

 final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X