2012-01-21 42 views
17

पर एक आवेदन मैं विकसित करने की आवश्यकता से, मैं FontName-नियमित, FontName-बोल्ड, FontName-यह की तरह कई फाइलों है कि एक विशिष्ट फ़ॉन्ट भेजी गई है। मुझे इसे एप्लिकेशन में सभी टेक्स्टव्यू में उपयोग करने की ज़रूरत है। सबसे पहले मैंने सोचा कि यह एक आसान काम था। अतः पर नज़र डालें और एक बहुत अच्छा धागा मिला: hereकस्टम फ़ॉन्ट्स और कस्टम TextView एंड्रॉयड

तो सबसे पहले मैं पसंद आया:

public static void overrideFonts(final Context context, final View v) { 
    try { 
     if (v instanceof ViewGroup) { 
      ViewGroup vg = (ViewGroup) v; 
      for (int i = 0; i < vg.getChildCount(); i++) { 
       View child = vg.getChildAt(i); 
       overrideFonts(context, child); 
      } 
     } else if (v instanceof TextView) { 
      ((TextView)v).setTypeface(FONT_REGULAR); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     // ignore 
    } 
} 

और मेरी गतिविधियों में onCreate दौरान इस विधि कहा जाता है। मेरे ऐप में प्रत्येक टेक्स्ट व्यू उस फ़ॉन्ट और लड़के को दिखा रहा था, क्या मैं इतनी आसानी से दूर होने के लिए खुश था। जब तक मुझे एक स्क्रीन नहीं मिली, जहां कुछ पाठ्यपुस्तकों को बोल्डStyle (android:textStyle="bold") के रूप में आवश्यक था। तब मुझे एहसास हुआ कि यह समाधान मुझे फ़ॉन्ट-बोल्ड लोड करने की संभावना प्रदान नहीं करता है। संपत्ति से संबंधित।

से आगे देखा और एक अच्छा कस्टम TextView कार्यान्वयन देखा था, एक ही तो सवाल में:

public class MyTextView extends TextView { 

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

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

    public MyTextView(Context context) { 
     super(context); 
     init(); 
    } 

    public void init() { 

     Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf"); 
     setTypeface(tf ,1); 

    } 
    } 

यह और भी बेहतर लग रहा है। मेरा सवाल है: यदि मेरे नियंत्रण में स्टाइल सेट बोल्ड है या नहीं तो मैं init() पर कैसे पता लगा सकता हूं ताकि मैं अनुरोधित टाइपफ़ेस असाइन कर सकूं?

आपके समय के लिए धन्यवाद।

LE। नीचे दिए गए उदाहरण के बाद, मैं अपने वर्ग को नवीनीकृत किया है के रूप में:

public class MyTextView extends TextView { 

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_BOLD); 

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

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

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

    public void setTypeface(Typeface tf, int style) { 
     if (style == Typeface.BOLD) { 
      super.setTypeface(boldTypeface/*, -1*/); 
     } else { 
      super.setTypeface(normalTypeface/*, -1*/); 
     } 
    } 
} 

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

मैंने ब्लॉग पोस्ट here on my blog पर सबकुछ समझाया है, यह शायद किसी की मदद करेगा।

+0

धन्यवाद करने के लिए विस्तृत प्रश्न और विस्तार के लिए, और महान ब्लॉग पोस्ट के लिए!मेरे लिए पूरी तरह से काम किया। मैंने उसी परिणाम के लिए बटन को भी वर्गीकृत किया। मेरी एकमात्र क्वेरी w.r.t. है createFromAsset() _every_ समय कॉल करने की क्षमता। क्या फ़ॉन्ट्स को एक बार लोड करना और उन्हें अपने एप्लिकेशन क्लास में स्टोर करना बेहतर होगा, और MyTextView.setTypeface() से इन तक पहुंचें? –

+0

आपके शब्दों के लिए धन्यवाद। मैंने इसके बारे में भी सोचा लेकिन यह देखने के लिए परीक्षण नहीं किया कि यह कैसे काम करता है या नहीं। यह ठीक काम करना चाहिए। वैसे भी मैंने स्क्रीन पर कई विचारों के साथ प्रदर्शन का कोई जुर्माना नहीं देखा है। – Alin

उत्तर

24

TextView का निर्माता setTypeface(Typeface tf, int style)style पैरामीटर एक्सएमएल विशेषता android:textStyle से पुनर्प्राप्त पैरामीटर के साथ कॉल करता है। तो, अगर आप इस कॉल अवरोधन करने अपनी खुद की टाइपफेस बाध्य करना चाहते हैं आप इस प्रकार इस विधि ओवरराइड कर सकते हैं:

public void setTypeface(Typeface tf, int style) { 
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf"); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf"); 

    if (style == Typeface.BOLD) { 
     super.setTypeface(boldTypeface/*, -1*/); 
    } else { 
     super.setTypeface(normalTypeface/*, -1*/); 
    } 
} 
+0

आपका समाधान सही लगता है, लेकिन यह काम नहीं करता है .... – Alin

+2

@Alin: समस्या यह थी कि 'टाइपफेसफेस() 'को टाइपफेस के निर्माण से पहले रचनाकारों द्वारा बुलाया जाता है! तो, 'टाइपफेस के अंदर' setTypeface() 'के निर्माण को स्थानांतरित करें और अब यह काम करेगा! –

+0

अब यह काम करता है, धन्यवाद। तुमने मेरा दिन सफल कर दिया। – Alin

9

आप उपयोग कर सकते हैं मेरी CustomTextView जो आप अपने assets फ़ोल्डर में एक फ़ॉन्ट फ़ाइल नाम निर्दिष्ट कर सकते हैं:

https://github.com/mafshin/CustomTextView

और उपयोग वास्तव में सरल है:

<com.my.app.CustomTextView 
     xmlns:custom="http://schemas.android.com/apk/res/com.my.app"    
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test text" 
     android:id="@+id/testcustomview" 

     custom:fontAssetName="Politica XT.otf" 
     /> 
2

मुझे लगता है कि यह creat करने के लिए बेहतर है ई कस्टम फोंट के लिए अपने स्वयं के पैकेज और उन्हें अपने प्रोजेक्ट में आयात ताकि आप भविष्य

package com.codeslips.utilities; 

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

    public class CustomTextView extends TextView { 

      public CustomTextView(Context context) 
       { super(context); setFont(); } 

      public CustomTextView(Context context,AttributeSet set) 
      { super(context,set); setFont(); } 

      public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
      { super(context,set,defaultStyle); setFont(); } 

      private void setFont() { 

      Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
      setTypeface(typeface); //function used to set font 

      } 
      } 

में बाद में उन्हें इस्तेमाल कर सकते हैं अब आप अपने एक्सएमएल फ़ाइल में ऊपर वर्ग का उपयोग अपने कस्टम फ़ॉन्ट

<com.codeslips.utilities.CustomTextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:text="Upload Image" 
     android:paddingTop="10sp" 
     android:textSize="14sp" 
     android:layout_weight="0.7" 
     android:textColor="@android:color/white"/> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^