EDIT: en fait ça fait un moment, et je tiens à ajouter que je pense est la meilleure façon pour ce faire, et grâce à XML pas moins!
Alors d'abord, vous allez avoir à faire une nouvelle classe qui remplace ce que la Vue que vous souhaitez personnaliser. (par exemple, veulent un Bouton avec une mesure de police? Étendre Button
). Nous allons faire un exemple:
public class CustomButton extends Button {
private final static int ROBOTO = 0;
private final static int ROBOTO_CONDENSED = 1;
public CustomButton(Context context) {
super(context);
}
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
parseAttributes(context, attrs); //I'll explain this method later
}
public CustomButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
parseAttributes(context, attrs);
}
}
Maintenant, si vous n'en avez pas, ajoutez un document XML en vertu de l' res/values/attrs.xml
, et ajoutez:
<resources>
<!-- Define the values for the attribute -->
<attr name="typeface" format="enum">
<enum name="roboto" value="0"/>
<enum name="robotoCondensed" value="1"/>
</attr>
<!-- Tell Android that the class "CustomButton" can be styled,
and which attributes it supports -->
<declare-styleable name="CustomButton">
<attr name="typeface"/>
</declare-styleable>
</resources>
D'accord, donc, avec cela, revenons à l' parseAttributes()
méthode de plus en plus tôt:
private void parseAttributes(Context context, AttributeSet attrs) {
TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);
//The value 0 is a default, but shouldn't ever be used since the attr is an enum
int typeface = values.getInt(R.styleable.CustomButton_typeface, 0);
switch(typeface) {
case ROBOTO: default:
//You can instantiate your typeface anywhere, I would suggest as a
//singleton somewhere to avoid unnecessary copies
setTypeface(roboto);
break;
case ROBOTO_CONDENSED:
setTypeface(robotoCondensed);
break;
}
values.recycle();
}
Maintenant vous êtes tous ensemble. Vous pouvez ajouter des attributs supplémentaires pour sujet de n'importe quoi (vous pouvez en ajouter un autre pour typefaceStyle -- gras, italique, etc.) mais maintenant, nous allons voir comment l'utiliser:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.yourpackage.name.CustomButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me!"
custom:typeface="roboto" />
</LinearLayout>
L' xmlns:custom
ligne peut vraiment être n'importe quoi, mais la convention est ce qui est indiqué ci-dessus. Ce qui importe, c'est qu'il est unique, et c'est pourquoi le nom du package est utilisé. Maintenant, il vous suffit d'utiliser l' custom:
préfixe pour vos attributs, et l' android:
préfixe pour android attributs.
Une dernière chose: si vous voulez l'utiliser dans un style (res/values/styles.xml
), vous ne devez pas ajouter de l' xmlns:custom
ligne de. Juste référence au nom de l'attribut avec aucun préfixe:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
En utilisant une mesure de police dans Android
Cela devrait aider. Fondamentalement, il n'y a aucun moyen de le faire en XML, et aussi loin que je peux dire, pas de moyen plus facile de le faire dans le code. Vous pourriez toujours avoir une setLayoutFont() méthode qui crée la police une fois, puis exécute setTypeface() pour chaque. Vous avez juste à le mettre à jour chaque fois que vous ajoutez un nouvel élément à une mise en page. Quelque chose comme ci-dessous:
public void setLayoutFont() {
Typeface tf = Typeface.createFromAsset(
getBaseContext().getAssets(), "fonts/BPreplay.otf");
TextView tv1 = (TextView)findViewById(R.id.tv1);
tv1.setTypeface(tf);
TextView tv2 = (TextView)findViewById(R.id.tv2);
tv2.setTypeface(tf);
TextView tv3 = (TextView)findViewById(R.id.tv3);
tv3.setTypeface(tf);
}
EDIT: je viens de recevoir autour à la mise en œuvre de quelque chose comme cela moi-même, et comment j'ai fini par faire, c'était faire une fonction comme ceci:
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
Ensuite, il suffit d'utiliser cette méthode onCreate(), et passer tous les TextViews vous souhaitez mettre à jour:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
EDIT 9/5/12:
Donc, puisque c'est toujours des points de vue et de voix, je voudrais ajouter une bien meilleure et plus complète de la méthode:
Typeface mFont = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
ViewGroup root = (ViewGroup)findViewById(R.id.myrootlayout);
setFont(root, mFont);
/*
* Sets the font on all TextViews in the ViewGroup. Searches
* recursively for all inner ViewGroups as well. Just add a
* check for any other views you want to set as well (EditText,
* etc.)
*/
public void setFont(ViewGroup group, Typeface font) {
int count = group.getChildCount();
View v;
for(int i = 0; i < count; i++) {
v = group.getChildAt(i);
if(v instanceof TextView || v instanceof Button /*etc.*/)
((TextView)v).setTypeface(font);
else if(v instanceof ViewGroup)
setFont((ViewGroup)v, font);
}
}
Si vous passez à la racine de votre mise en page, il va vérifier de manière récursive pour TextView
ou Button
vues (ou tout autres vous ajoutez à cela que si l'instruction) à l'intérieur de cette disposition, et de définir la police sans que vous ayez à préciser par ID. C'est bien sûr en supposant que vous souhaitez définir la police de caractères à chaque vue.