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.
Réponses
Trop de publicités?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.
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>
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
.
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");