836 Stimmen

Wie ändert man die fontFamily von TextView in Android

Ich möchte also die android:fontFamily in Android, aber ich sehe keine vordefinierten Schriftarten in Android. Wie kann ich eine der vordefinierten Schriftarten auswählen? Ich brauche nicht wirklich meine eigene TypeFace zu definieren, aber alles, was ich brauche, ist etwas anderes als das, was es jetzt zeigt.

<TextView
    android:id="@+id/HeaderText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="52dp"
    android:gravity="center"
    android:text="CallerBlocker"
    android:textSize="40dp"
    android:fontFamily="Arial"
 />

Es scheint, dass das, was ich da oben gemacht habe, nicht wirklich funktioniert! ÜBRIGENS: android:fontFamily="Arial" war ein dummer Versuch!

5voto

Terry Liu Punkte 601

Der gültige Wert von Android:fontFamily ist in /system/etc/system_fonts.xml(4.x) oder /system/etc/fonts.xml(5.x) definiert. Der Gerätehersteller kann diesen Wert jedoch ändern, so dass die tatsächlich verwendete Schriftart von der oben erwähnten Datei des angegebenen Geräts abhängt.

In AOSP ist die Schriftart Arial gültig, muss aber mit "arial" und nicht mit "Arial" definiert werden, zum Beispiel Android:fontFamily="arial" . Werfen Sie einen Blick auf Kitkats system_fonts.xml

    <family>
    <nameset>
        <name>sans-serif</name>
        <name>arial</name>
        <name>helvetica</name>
        <name>tahoma</name>
        <name>verdana</name>
    </nameset>
    <fileset>
        <file>Roboto-Regular.ttf</file>
        <file>Roboto-Bold.ttf</file>
        <file>Roboto-Italic.ttf</file>
        <file>Roboto-BoldItalic.ttf</file>
    </fileset>
</family>

//////////////////////////////////////////////////////////////////////////

Es gibt drei relevante xml-Attribute für die Definition einer "Schriftart" in Layout-- Android:fontFamily , Android:Schriftart y Android:textStyle . Die Kombination von "fontFamily" und "textStyle" oder "typeface" und "textStyle" kann verwendet werden, um das Erscheinungsbild der Schriftart im Text zu ändern, so auch allein verwendet. Codeschnipsel in TextView.java wie diese:

    private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) {
    Typeface tf = null;
    if (familyName != null) {
        tf = Typeface.create(familyName, styleIndex);
        if (tf != null) {
            setTypeface(tf);
            return;
        }
    }
    switch (typefaceIndex) {
        case SANS:
            tf = Typeface.SANS_SERIF;
            break;

        case SERIF:
            tf = Typeface.SERIF;
            break;

        case MONOSPACE:
            tf = Typeface.MONOSPACE;
            break;
    }
    setTypeface(tf, styleIndex);
}

    public void setTypeface(Typeface tf, int style) {
    if (style > 0) {
        if (tf == null) {
            tf = Typeface.defaultFromStyle(style);
        } else {
            tf = Typeface.create(tf, style);
        }

        setTypeface(tf);
        // now compute what (if any) algorithmic styling is needed
        int typefaceStyle = tf != null ? tf.getStyle() : 0;
        int need = style & ~typefaceStyle;
        mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
        mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
    } else {
        mTextPaint.setFakeBoldText(false);
        mTextPaint.setTextSkewX(0);
        setTypeface(tf);
    }
}

Aus dem Code können wir sehen:

  1. wenn "fontFamily" gesetzt ist, wird die "typeface" ignoriert.
  2. "typeface" hat standardmäßige und begrenzte gültige Werte. Die Werte sind "normal", "sans", "serif" und "monospace", die in system_fonts.xml(4.x) oder fonts.xml(5.x) zu finden sind. Eigentlich sind sowohl "normal" als auch "sans" die Standardschriftart von system.
  3. Mit "fontFamily" können alle Schriftarten der eingebauten Schriftarten eingestellt werden, während "typeface" nur die typischen Schriftarten "sans-serif", "serif" und "monospace" (die drei Hauptkategorien von Schriftarten in der Welt) bietet.
  4. Wenn nur "textStyle" gesetzt wird, werden tatsächlich die Standardschriftart und der angegebene Stil eingestellt. Die effektiven Werte sind "normal" "fett" "kursiv" und "fett | kursiv".

5voto

MdBasha Punkte 403

Um die Schriftart per Programm einzustellen, schreiben Sie...

 TextView tv7 = new TextView(this);
 tv7.setText(" TIME ");    
 tv7.setTypeface(Typeface.create("sans-serif-condensed",Typeface.BOLD));
 tv7.setTextSize(12);
 tbrow.addView(tv7);

Der Name "sans-serif-condensed" wird von der Datei fonts.xml referenziert, die im Ordner "app--> res--> values" erstellt werden sollte und in der die Schriftarten enthalten sind.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="font_family_light">sans-serif-light</string>
    <string name="font_family_medium">sans-serif-medium</string>
    <string name="font_family_regular">sans-serif</string>
    <string name="font_family_condensed">sans-serif-condensed</string>
    <string name="font_family_black">sans-serif-black</string>
    <string name="font_family_thin">sans-serif-thin</string>
</resources>

Ich hoffe, das ist klar!

4voto

Frédéric Punkte 77

Hier ist ein leichter wa Das kann in manchen Fällen funktionieren. Das Prinzip besteht darin, eine nicht sichtbare TextVview in Ihr Xml-Layout einzufügen und sein typeFace erhalten im Java-Code.

Das Layout in der Xml-Datei:

<TextView
    android:text="The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty."
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:fontFamily="sans-serif-thin"
    android:id="@+id/textViewDescription"/>

Und der Java-Code:

myText.setTypeface(textViewSelectedDescription.getTypeface());

Bei mir hat es funktioniert (z. B. innerhalb eines TextSwitcher).

3voto

Shubham Raitka Punkte 874

Wenn Sie eine TextView an vielen Stellen mit der gleichen Schriftfamilie verwenden möchten, erweitern Sie die TextView-Klasse und legen Sie die Schriftart wie folgt fest:-

public class ProximaNovaTextView extends TextView {
    public ProximaNovaTextView(Context context) {
        super(context);
        applyCustomFont(context);
    }
    public ProximaNovaTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

        applyCustomFont(context);
    }
    public ProximaNovaTextView(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
       applyCustomFont(context);
    } 
    private void applyCustomFont(Context context) {
        Typeface customFont = FontCache.getTypeface("proximanova_regular.otf", context);
        setTypeface(customFont);
    }
}

Und dann verwenden Sie diese benutzerdefinierte Klasse in XML für die TextView wie folgt: -

<com.myapp.customview.ProximaNovaTextView
android:id="@+id/feed_list_item_name_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
/>

3voto

Yang Peiyong Punkte 11366
<string name="font_family_display_4_material">sans-serif-light</string>
<string name="font_family_display_3_material">sans-serif</string>
<string name="font_family_display_2_material">sans-serif</string>
<string name="font_family_display_1_material">sans-serif</string>
<string name="font_family_headline_material">sans-serif</string>
<string name="font_family_title_material">sans-serif-medium</string>
<string name="font_family_subhead_material">sans-serif</string>
<string name="font_family_menu_material">sans-serif</string>
<string name="font_family_body_2_material">sans-serif-medium</string>
<string name="font_family_body_1_material">sans-serif</string>
<string name="font_family_caption_material">sans-serif</string>
<string name="font_family_button_material">sans-serif-medium</string>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X