EDIT : Es ist also eine Weile her und ich möchte hinzufügen, was meiner Meinung nach der beste Weg ist, dies zu tun, und nicht weniger über XML!
Zunächst möchten Sie eine neue Klasse erstellen, die alle Ansichten überschreibt, die Sie anpassen möchten. (zB möchten Sie einen Button mit einer benutzerdefinierten Schrift? Erweitern Button
). Machen wir ein Beispiel:
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);
}
}
Wenn Sie noch keines haben, fügen Sie unter ein XML-Dokument hinzu res/values/attrs.xml
und fügen Sie Folgendes hinzu:
<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>
Okay, wenn das aus dem Weg ist, kehren wir zu der parseAttributes()
Methode von früher zurück:
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();
}
Jetzt sind Sie fertig. Sie können für fast alles weitere Attribute hinzufügen (Sie können ein weiteres für typefaceStyle hinzufügen - fett, kursiv usw.), aber jetzt wollen wir sehen, wie es verwendet wird:
<?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>
Die xmlns:custom
Linie kann wirklich alles sein, aber die Konvention ist die oben gezeigte. Was zählt ist, dass es einzigartig ist und deshalb der Paketname verwendet wird. Jetzt verwenden Sie nur das custom:
Präfix für Ihre Attribute und das android:
Präfix für Android-Attribute.
Eine letzte Sache: Wenn Sie dies in einem style ( res/values/styles.xml
) verwenden möchten , sollten Sie die Zeile nicht hinzufügen xmlns:custom
. Verweisen Sie einfach auf den Namen des Attributs ohne Präfix:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
Verwenden einer benutzerdefinierten Schriftart in Android
Das sollte helfen. Grundsätzlich gibt es keine Möglichkeit, dies in XML zu tun, und soweit ich das beurteilen kann, gibt es keine einfachere Möglichkeit, dies in Code zu tun. Sie können jederzeit eine setLayoutFont () -Methode verwenden, die die Schriftart einmal erstellt und dann für jede setTypeface () ausführt. Sie müssen es nur jedes Mal aktualisieren, wenn Sie einem Layout ein neues Element hinzufügen. So etwas wie unten:
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 : Also bin ich gerade dazu gekommen, so etwas selbst zu implementieren, und wie ich dazu kam, hat ich eine Funktion wie diese gemacht:
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
Verwenden Sie dann einfach diese Methode von onCreate () und übergeben Sie alle TextViews, die Sie aktualisieren möchten:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
EDIT 9/5/12:
Da dies immer noch Ansichten und Stimmen erhält, möchte ich eine viel bessere und vollständigere Methode hinzufügen:
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);
}
}
Wenn Sie ihm das Stammverzeichnis Ihres Layouts übergeben, wird rekursiv nach TextView
oder Button
Ansichten (oder anderen, die Sie zu dieser if-Anweisung hinzufügen) in diesem Layout gesucht und die Schriftart festgelegt, ohne dass Sie sie anhand der ID angeben müssen. Dies setzt natürlich voraus, dass Sie die Schriftart für jede Ansicht festlegen möchten .