कस्टम फ़ॉन्ट और XML लेआउट (Android)


174

मैं Android में XML फ़ाइलों का उपयोग करके GUI लेआउट को परिभाषित करने का प्रयास कर रहा हूं। जहां तक ​​मुझे पता चल सकता है, यह निर्दिष्ट करने का कोई तरीका नहीं है कि XML विजेट्स में आपके विजेट्स को एक कस्टम फॉन्ट (जैसे कि आपने संपत्ति / फॉन्ट / में रखा है) का उपयोग करना चाहिए और आप केवल सिस्टम इंस्टॉल किए गए फॉन्ट का उपयोग कर सकते हैं।

मुझे पता है कि, जावा कोड में, मैं अद्वितीय आईडी का उपयोग करके मैन्युअल रूप से प्रत्येक विजेट के फ़ॉन्ट को बदल सकता था। वैकल्पिक रूप से, मैं इस बदलाव को करने के लिए जावा के सभी विजेट पर पुनरावृति कर सकता हूं, लेकिन यह शायद बहुत धीमी गति से होगा।

मेरे पास अन्य विकल्प क्या हैं? क्या विगेट्स बनाने का कोई बेहतर तरीका है जो एक कस्टम लुक है? मैं विशेष रूप से हर नए विजेट के लिए फ़ॉन्ट को मैन्युअल रूप से बदलना नहीं चाहता।


68
DrDefrost - कृपया कुछ उत्तर स्वीकार करें, आपको इस साइट पर अधिक प्रतिक्रियाएँ मिलेंगी।
SK9

1
: यहाँ एक और इसी तरह के सवाल है stackoverflow.com/questions/9030204/...
Vins

अपडेट किया गया 05/2017: "सपोर्ट लाइब्रेरी 26.0 बीटा एंड्रॉइड एपीआई संस्करण 14 और उच्चतर चलाने वाले उपकरणों पर एक्सएमएल सुविधा में फ़ॉन्ट्स को समर्थन प्रदान करता है।" देखें: developer.android.com/preview/features/…
अल्बर्ट c ब्रौन

जवाबों:


220

जैसा कि मैंने यहां सीखा है, कस्टम टेक्स्ट सेट करने के लिए आप टेक्स्ट व्यू बढ़ा सकते हैं

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml: (रेस / मूल्यों में)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewPlus">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

आप संपत्ति फ़ोल्डर में "saxmono.ttf" डालेंगे ।

अद्यतन 8/1/13

इस पद्धति के साथ गंभीर स्मृति चिंताएं हैं। नीचे देखें चेदाबोब की टिप्पणी


5
यह अच्छा लग रहा है, हालांकि, मुझे एक त्रुटि मिल रही है जब मैं main.xml में "TextViewPlus" का उपयोग करने का प्रयास करता हूं। मुझे निम्न मिलता है: - त्रुटि: XML को पार्स करने में त्रुटि: अनबाउंड उपसर्ग - विशेषता "foo: customFont" के लिए उपसर्ग "फू" एक तत्व प्रकार "supportLibs.TextViewPlus" के साथ जुड़ा हुआ नहीं है।
मज्जूदी

79
एक बात का ध्यान रखें कि यह दर्जनों और दर्जनों प्रकार की ऑब्जेक्ट्स उत्पन्न करेगा और मेमोरी को खाएगा। प्री-4.0 एंड्रॉइड में एक बग है जो टाइपफेस को ठीक से मुक्त नहीं करता है। सबसे आसान काम है एक HashMap के साथ TypeFace कैश बनाना। इसने मेरे ऐप में मेमोरी उपयोग को 120+ mb से 18mb तक नीचे ला दिया। code.google.com/p/android/issues/detail?id=9904
chedabob

7
@ मज्जूदी: यह आमतौर पर तब होता है जब आप अपने लेआउट में दूसरा नाम स्थान जोड़ना भूल जाते हैं:xmlns:foo="http://schemas.android.com/apk/res/com.example
थियो

11
बहुत महत्वपूर्ण - मैं सिर्फ चेदाबोब की सलाह को दोगुना करना चाहूंगा। जब तक आप इसका पालन नहीं करते हैं, आपके पास प्री-आईसीएस में मेमोरी लीक होगा। कुछ समाधान हैं, उनमें से एक chedabob द्वारा उपलब्ध कराए गए लिंक में है, एक अन्य यहाँ है: stackoverflow.com/questions/8057010/listview-memory-leak । पीटर - कृपया अपने उत्तर को अपडेट करें - यह बहुत अच्छा है लेकिन पूरा नहीं है
माइकेल

1
मैं इस कस्टम विशेषता को चौड़ाई और ऊंचाई जैसे अन्य टेक्स्टव्यू विशेषताओं के अलावा style.xml में कैसे सेट करूं?
लोशेग

35

मुझे पार्टी के लिए 3 साल की देरी हो गई है :( हालांकि यह किसी के लिए उपयोगी हो सकता है जो इस पद पर ठोकर खा सकता है।

मैंने एक लाइब्रेरी लिखी है जो टाइपफेस को कैश करता है और आपको एक्सएमएल से सही कस्टम टाइपफेस निर्दिष्ट करने की भी अनुमति देता है। आप पुस्तकालय यहाँ पा सकते हैं ।

जब आप इसका उपयोग करते हैं तो आपका XML लेआउट कैसा दिखेगा।

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />

अरे @ रघुनाथ-जवाहर, मैं एक प्रॉजेक्ट प्रोजेक्ट के लिए लाइब्रेरी को कैसे इंपोर्ट करूंगा? मैंने कोशिश की compile 'com.mobsandgeeks:android-typeface-textview:1.0'लेकिन वह काम नहीं किया।
टारगेटो

1
आपको इस तरह से उपयोग करने में सक्षम होने के लिए AAR की आवश्यकता होगी। यह अभी तक वहां नहीं है। आप स्रोतों की प्रतिलिपि बना सकते हैं और अभी के लिए एक Android स्टूडियो लाइब्रेरी प्रोजेक्ट बना सकते हैं।
रघुनाथ जवाहर

2
आपकी geekui टैग कहाँ से आई है?
सेफीरोसु

3
मूल टैग में निर्दिष्ट नाम स्थान से -xmlns:geekui="http://schemas.android.com/apk/res-auto"
रघुनाथ जवाहर

1
@MuhammedRefaat, हाँ यह करता है :)
रघुनाथ जवाहर

18

यह थोड़ी देर हो सकती है, लेकिन आपको एक एकल वर्ग बनाने की आवश्यकता है जो मेमोरी लीक से बचने के लिए कस्टम टाइपफेस लौटाता है।

TypeFace वर्ग:

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

कस्टम टेक्स्ट दृश्य:

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

Xml द्वारा:

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

प्रोग्राम के रूप में:

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());

रनटाइम में काम करने लगता है, लेकिन क्या यह डिजाइनर में भी काम करना चाहिए?
मैग्नस जोहानसन

ज़रूर। आप xml के रूप में उपयोग कर सकते हैं। @ मैग्नस
लियोनार्डो

मुझे लगता है कि आपने गलत समझा, यह डिज़ाइन समय (डिज़ाइनर पूर्वावलोकन) में काम नहीं करता है । (xml! = डिज़ाइनर)। यह रनटाइम में संकलित Xml लेआउट फ़ाइल में निर्दिष्ट ठीक काम करता है। वैसे भी, मैं इस एक्सटेंशन का उपयोग कर रहा हूँ github.com/danh32/Fontify , जो मेरी ज़रूरतों के लिए बहुत बेहतर काम करता है (यह कई फॉन्ट स्टाइल, रेगुलर, बोल्ड आदि के साथ-साथ अलग-अलग फोंट के नाम के साथ-साथ टेक्स्टव्यू से परे अन्य नियंत्रणों का समर्थन करता है)
मैग्नस जोहानसन

2
GetTypeFace हर कॉल पर एक नया टाइपफेस बनाता है ... यह सिंगलटन के उद्देश्य को पराजित करता है। इसमें एक स्थिर फ़ील्ड होना चाहिए जो पहली बार कॉल करने के लिए सेट किया गया है और बाद की कॉल पर फ़ील्ड का मान लौटाता है।
स्टीवन पेना

1
@chiwai तुम सही हो! पहले प्रश्न के बारे में इसे इसकी आवश्यकता नहीं है। दूसरे के बारे में यह एक टाइपो था।
लियोनार्डो कार्डसो

13

पुराना सवाल है, लेकिन मुझे यकीन है कि मैं एक अच्छा समाधान के लिए अपनी खुद की खोज शुरू करने से पहले यहां इस जवाब को पढ़ता हूं। सुलेखandroid:fontFamily अपने एसेट फ़ोल्डर में कस्टम फोंट के लिए समर्थन जोड़ने के लिए विशेषता का विस्तार करता है , जैसे:

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

इसे सक्रिय करने के लिए केवल एक चीज जो आप इसे उपयोग कर रहे हैं, वह उस गतिविधि के संदर्भ में संलग्न है जिसे आप उपयोग कर रहे हैं:

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

आप अपने स्वयं के कस्टम विशेषता को बदलने के लिए भी निर्दिष्ट कर सकते हैं android:fontFamily

यह AppTheme सहित थीम में भी काम करता है।


8

DataBinding का उपयोग करना :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

XML में:

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

फ़ॉन्ट फ़ाइल में होना चाहिए assets/fonts/


7

यदि आपके पास केवल एक टाइपफेस है जिसे आप जोड़ना चाहते हैं, और कम कोड लिखना चाहते हैं, तो आप अपने विशिष्ट फ़ॉन्ट के लिए एक समर्पित टेक्स्ट व्यू बना सकते हैं। नीचे कोड देखें।

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

Main.xml में, अब आप अपना textView इस तरह जोड़ सकते हैं:

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

इस init पर () करें और अपने आप को उसी कॉल से 3x सेव करें।
एरिकोसग

@ericosg i को यह त्रुटि तब मिलती है जब मैं आपके athis solution android.view.InflateException का उपयोग करता हूं: बाइनरी एक्सएमएल फ़ाइल लाइन # 9: कक्षा में आने वाली त्रुटि com.ascent.adwad.utils.CustomTextView
सागर देविका

@ सागरडंगा, अधिक जानकारी के बिना मदद करना मुश्किल है। शायद जहाँ तक आप ले जा सकते हैं और एक नया प्रश्न करें।
एरिकोसग

7

Android O पूर्वावलोकन रिलीज़ से इसे करने का सबसे अच्छा तरीका है
। 1.) Res फ़ोल्डर पर राइट-क्लिक करें और नया> Android संसाधन निर्देशिका पर जाएं । नई
संसाधन निर्देशिका विंडो प्रकट होती है।
2.) संसाधन प्रकार सूची में, फ़ॉन्ट का चयन करें और फिर ठीक पर क्लिक करें।
3.) फ़ॉन्ट फ़ोल्डर में अपनी फ़ॉन्ट फ़ाइलों को जोड़ें । नीचे फ़ोल्डर संरचना R.font.dancing_script, R.font.la_la, और R.font.ba_ba उत्पन्न करता है।
4.) संपादक में फ़ाइल के फोंट का पूर्वावलोकन करने के लिए एक फ़ॉन्ट फ़ाइल पर डबल-क्लिक करें

आगे हमें एक फ़ॉन्ट परिवार बनाना होगा

1.) फ़ॉन्ट फ़ोल्डर पर राइट-क्लिक करें और नई> फ़ॉन्ट संसाधन फ़ाइल पर जाएं । नई संसाधन फ़ाइल विंडो दिखाई देती है।
2.) फ़ाइल का नाम दर्ज करें , और उसके बाद ठीक क्लिक करें । नया फॉन्ट संसाधन XML संपादक में खुलता है।
3.) फ़ॉन्ट टैग तत्व में प्रत्येक फ़ॉन्ट फ़ाइल, शैली और वजन विशेषता संलग्न करें। निम्न XML फ़ॉन्ट संसाधन XML में फ़ॉन्ट से संबंधित विशेषताओं को दिखाता है:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
    android:fontStyle="normal"
    android:fontWeight="400"
    android:font="@font/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

TextView में फ़ॉन्ट जोड़ना:

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    **android:fontFamily="@font/ba_ba"**/>

जैसा कि प्रलेखन से

फ़ॉन्ट्स के साथ काम करना

सभी चरण सही हैं।


1
सबसे अच्छा जवाब! फ़ॉन्ट फ़ाइल नाम लोअरकेस में होना चाहिए।
दिमित्री

आप एक कस्टम शैली भी बना सकते हैं जिसे आप अपने एप्लिकेशन (AndroidManifest फ़ाइल के तहत) पर लागू करते हैं और इसे सभी दृश्यों को दिया जाएगा। उदाहरण के लिए, केवल इसे एक TextView पर रखने से, क्योंकि यह टूलबार को प्रभावित नहीं करेगा।
सुनहरीमजाज

5

बढ़ाएँ TextViewऔर इसे एक कस्टम विशेषता दें या बस Android का उपयोग करें: टैग विशेषता स्ट्रिंग में पास करने के लिए जिसे आप उपयोग करना चाहते हैं। आपको एक कन्वेंशन चुनने और उससे चिपकना होगा जैसे कि मैं अपने सभी फोंट को रेस / एसेट्स / फोंट / फोल्डर में डालूंगा, ताकि आपका टेक्स्टव्यू क्लास जानता हो कि उन्हें कहां खोजना है। फिर अपने निर्माता में आप सुपर कॉल के बाद मैन्युअल रूप से फ़ॉन्ट सेट करें।


4

कस्टम कोड का उपयोग करने का एकमात्र तरीका स्रोत कोड है।

बस याद रखें कि एंड्रॉइड बहुत सीमित संसाधनों के साथ उपकरणों पर चलता है और फोंट को अच्छी मात्रा में रैम की आवश्यकता हो सकती है। अंतर्निहित Droid फोंट विशेष रूप से बनाए गए हैं और, यदि आप ध्यान दें, तो कई अक्षर और सजावट गायब हैं।


"बस याद रखें कि एंड्रॉइड बहुत सीमित संसाधनों वाले उपकरणों पर चलता है" -> यह मामला कम होता जा रहा है। क्वाड कोर फोन? वास्तव में??
सैंडी

9
मैं tareqHs के उत्तर के संदर्भ पर विचार करने के लिए और अधिक करना चाहूंगा, जो आपकी टिप्पणी को अच्छे 2 और डेढ़ साल से पहले बताता है।
SK9

आपकी प्रतिक्रिया का पहला भाग तब सत्य हो सकता है जब आपने 2010 में अपना उत्तर लिखा था। उत्तरार्द्ध सुपरफ्लॉयॉयस है और इस बिंदु के बगल में है: Droid बुरा था, 2012 में Google द्वारा Roboto के पक्ष में खाई गई थी। एंड्रॉइड में टाइपोग्राफी में पसंद की कमी एक दोष है, एक विशेषता नहीं है; iOS के पास प्राइमरी डिवाइसेस के तहत 2008 से आज तक के मानकों के अनुसार कई फोंट उपलब्ध हैं।
Cosmix

यह उत्तर अब मान्य नहीं है।
मार्टिन कोंकणी

2

मेरे पास TextView का विस्तार किए बिना और एक लंबा कोड लागू किए बिना प्रश्न के लिए एक सरल उत्तर हो सकता है।

कोड:

 TextView tv = (TextView) findViewById(R.id.textview1);
    tv.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

संपत्ति फ़ोल्डर में कस्टम फ़ॉन्ट फ़ाइल को हमेशा की तरह रखें और यह प्रयास करें। इससे मेरा काम बनता है। मुझे अभी समझ में नहीं आया कि इस साधारण सी बात के लिए पीटर ने इतना बड़ा कोड क्यों दिया या उन्होंने पुराने संस्करण में अपना जवाब दिया।


2

कस्टम कक्षाएं बनाए बिना भी xml में परिभाषित किया जा सकता है

style.xml

<style name="ionicons" parent="android:TextAppearance">
    <!-- Custom Attr-->
    <item name="fontPath">fonts/ionicons.ttf</item>
</style>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/ionicons"
        android:text=""/>
</LinearLayout>

एक त्वरित टिप्पणी है, क्योंकि मैं तो बस हमेशा भूल गया जहां फोंट डाल करने के लिए, अपने उस फ़ॉन्ट के अंदर होना चाहिए assetsएक ही स्तर में और इस फ़ोल्डर बसता था कि resऔर src, मेरे मामले में अपनेassets/fonts/ionicons.ttf

अपडेटेड रूट लेआउट को अपडेट किया गया क्योंकि इस विधि xmlns:app="http://schemas.android.com/apk/res-auto"को काम करने की आवश्यकता है

अपडेट 2 एक लाइब्रेरी के बारे में भूल गया जिसे मैंने Calligraphy नाम से पहले इंस्टॉल किया है


यह मेरे लिए काम नहीं करता है। जब मैं इसे बनाने की कोशिश करता हूं तो मुझे त्रुटि संदेश मिलता है: त्रुटि: (49, 5) कोई भी संसाधन ऐसा नहीं मिला जो दिए गए नाम से मेल खाता हो: attr 'fontPath'।
स्टेफ

xmlns:app="http://schemas.android.com/apk/res-auto"अपने रूट लेआउट में जोड़ने की कोशिश करें, अपडेट किए गए उत्तर की भी जांच करें
norman784

त्रुटि लेआउट XML फ़ाइल से नहीं, बल्कि शैलियों XML फ़ाइल से आती है। ऐसा लगता है कि यह नहीं जानता है कि एक फॉन्टपैथ क्या है।
स्टेफ

आपका अधिकार, भूल गया कि मैंने
norman784

1

पीटर का उत्तर सबसे अच्छा है, लेकिन इसे एंड्रॉइड से स्टाइल.एक्सएमएल का उपयोग करके अपने ऐप में सभी पाठ्यपुस्तकों के लिए अपने फोंट को अनुकूलित करने के लिए बेहतर बनाया जा सकता है।

मेरा कोड यहाँ है


1

फोंट अनुकूलित करने के दो तरीके हैं:

!!! संपत्ति / फोंट / iran_sans.ttf में मेरा कस्टम फ़ॉन्ट

तरीका 1: रिफंड टाइपफेस।क्लास ||| सबसे अच्छा तरीका

कॉल FontsOverride.setDefaultFont () वर्ग में अनुप्रयोग का विस्तार करता है, इस कोड के कारण सभी सॉफ्टवेयर फोंट बदल दिए जाएंगे, यहां तक ​​कि फोंट फोंट भी

AppController.java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.java

public class FontsOverride {

    public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }

    private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
        try {
            final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
            staticField.setAccessible(true);
            staticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

तरीका 2: setTypeface का उपयोग करें

विशेष दृश्य के लिए फ़ॉन्ट बदलने के लिए बस सेट टाइपफेस () पर कॉल करें।

CTextView.java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}

0

यहाँ एक ट्यूटोरियल है जो आपको दिखाता है कि @peter जैसे कस्टम फ़ॉन्ट को कैसे सेटअप किया जाए: http://responsiveandroid.com/2012/03/15/custom-fonts-in-android-widgets.html

इसमें संभावित मेमोरी लीक्स ala http://code.google.com/p/android/issues/detail?id=9904 पर भी विचार किया गया है । इसके अलावा ट्यूटोरियल में एक बटन पर एक कस्टम फ़ॉन्ट स्थापित करने के लिए एक उदाहरण है।


0

आप आसानी से कस्टम टेक्स्टव्यू क्लास बना सकते हैं: -

तो आपको पहले क्या करने की आवश्यकता है, वह Custom textviewवर्ग बनाएं जिसके साथ विस्तार किया गया है AppCompatTextView

public class CustomTextView extends AppCompatTextView {
    private int mFont = FontUtils.FONTS_NORMAL;
    boolean fontApplied;

    public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, context);
    }

    public CustomTextView(Context context) {
        super(context);
        init(null, context);
    }

    protected void init(AttributeSet attrs, Context cxt) {
        if (!fontApplied) {
            if (attrs != null) {
                mFont = attrs.getAttributeIntValue(
                        "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                        -1);
            }
            Typeface typeface = getTypeface();
            int typefaceStyle = Typeface.NORMAL;
            if (typeface != null) {
                typefaceStyle = typeface.getStyle();
            }
            if (mFont > FontUtils.FONTS) {
                typefaceStyle = mFont;
            }
            FontUtils.applyFont(this, typefaceStyle);
            fontApplied = true;
        }
    }
}

अब, हर बार कस्टम टेक्स्ट व्यू कॉल और हमें विशेषता से इंटिमेट वैल्यू मिलेगी int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1)

या

हम getTypeface () दृश्य से भी प्राप्त कर सकते हैं जिसे हम अपने xml ( android:textStyle="bold|normal|italic") में सेट करते हैं । इसलिए आप जो करना चाहते हैं वो करें।

अब, हम FontUtilsअपने विचार में किसी भी .ttf फ़ॉन्ट को सेट करने के लिए बनाते हैं।

public class FontUtils {

    public static final int FONTS = 1;
    public static final int FONTS_NORMAL = 2;
    public static final int FONTS_BOLD = 3;
    public static final int FONTS_BOLD1 = 4;

    private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();

    static Typeface getFonts(Context context, String name) {
        Typeface typeface = TYPEFACE.get(name);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(context.getAssets(), name);
            TYPEFACE.put(name, typeface);
        }
        return typeface;
    }

    public static void applyFont(TextView tv, int typefaceStyle) {

        Context cxt = tv.getContext();
        Typeface typeface;

        if(typefaceStyle == Typeface.BOLD_ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
        } else if (typefaceStyle == Typeface.ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
        } else {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }
        if (typeface != null) {
            tv.setTypeface(typeface);
        }
    }
}

0

यह जानना उपयोगी हो सकता है कि एंड्रॉइड 8.0 (एपीआई स्तर 26) से शुरू होकर आप एक्सएमएल में एक कस्टम फ़ॉन्ट का उपयोग कर सकते हैं

आप निम्नलिखित तरीके से पूरे आवेदन में एक कस्टम फ़ॉन्ट लागू कर सकते हैं।

  1. फ़ॉन्ट को फ़ोल्डर में रखें res/font

  2. में res/values/styles.xmlयह उपयोग आवेदन विषय में। <style name="AppTheme" parent="{whatever you like}"> <item name="android:fontFamily">@font/myfont</item> </style>



-5

आप विजेट बनाने या विजेट लेआउट में किसी एक का उपयोग करने के लिए TextView का विस्तार नहीं कर सकते हैं: http://developer.android.com/guide/topics/appwidgets/index.html


1
अहा - "विजेट" शब्द का प्रसिद्ध दोहरा उपयोग फिर से हमला करता है!
कार्ल व्हले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.