2016-02-05 5 views
5

मैं अपने ऐप में डिफ़ॉल्ट फ़ॉन्ट बदलने की कोशिश कर रहा हूं। लेकिन यह काम नहीं कर रहा है।एंड्रॉइड ऐप में डिफ़ॉल्ट फ़ॉन्ट बदलने में असमर्थ

1) बनाया वर्ग TypefaceUtil.java

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.Log; 

import java.lang.reflect.Field; 

public class TypefaceUtil { 

public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) { 
    try { 
     final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets); 

     final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride); 
     defaultFontTypefaceField.setAccessible(true); 
     defaultFontTypefaceField.set(null, customFontTypeface); 
    } catch (Exception e) { 
     Log.e("CustomFontException", "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride); 
    } 
    } 
} 

2) एक वर्ग का विस्तार आवेदन में:

public void onCreate() { 

    super.onCreate(); 
    TypefaceUtil.overrideFont(getApplicationContext(), "MONOSPACE", "fonts/varelaround_regular.ttf"); 
} 

3) में शैलियों ये कदम मैं ले लिया है कर रहे हैं। xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:typeface">monospace</item> 
</style> 

अभी भी यह काम नहीं कर रहा है। क्या मैं कुछ भूल रहा हूँ ?

+0

जोड़े अजीब, मैंने एक ही कोड का इस्तेमाल किया और यह मेरे लिए ठीक काम कर रहा था। केवल अंतर यह है कि मैंने 'मोनोस्पेस' के बजाय 'सेरिफ़' का उपयोग किया। –

उत्तर

2

मुझे एक बार इस समस्या का सामना करना पड़ा था। मुझे पूरा यकीन नहीं है कि यह क्यों काम करता है, लेकिन आप निम्न कोशिश कर सकते हैं: "मोनोस्पेस" के बजाय, इनमें से प्रत्येक को आजमाएं: DEFAULT, SANS_SERIF, SERIF। यह सभी टेक्स्टव्यू के लिए काम नहीं कर सकता है, जैसे ListView या रीसाइक्लिंग व्यू (अजीब, दाएं?) में। लेकिन उन मामलों में, मैंने एडाप्टर से प्रोग्रामेटिक रूप से टाइपफेस सेट किया है। कारण समझाने में असमर्थ के लिए खेद है।

+0

धन्यवाद, काम करता है। – SimenNash

1

इस उद्देश्य के लिए, मैं आपको सलाह देता हूं कि Calligraphy, https://github.com/chrisjenx/Calligraphy, एक भयानक lib, वास्तव में इसके साथ डिफ़ॉल्ट फ़ॉन्ट बदलने के लिए वास्तव में स्ट्रेट-फ़ॉरवर्ड का उपयोग करें, और इसमें कई अन्य उपयोगी कार्यक्षमताएं हैं।

आपको इसे सेट करने की आवश्यकता है सब कुछ रीडमे में होना चाहिए।

0

क्यों अपना कस्टम टेक्स्ट व्यू परिभाषित नहीं करें और इसे कोई फ़ॉन्ट असाइन करें। अपने उपयोगिता कक्षा में एक हैश नक्शे में संपत्ति से

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

import com.exmple.util.Utility; 

public class CustomFontEditText extends EditText { 

    private Context mContext; 

    private String ttfName; 

    String TAG = getClass().getName(); 

    public CustomFontEditText(Context context) { 
     super(context); 
     this.mContext = context; 
    } 

    public CustomFontEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     this.mContext = context; 

     // Typeface.createFromAsset doesn't work in the layout editor. 
     // Skipping... 
     if (isInEditMode()) { 
      return; 
     } 

     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
      this.ttfName = attrs.getAttributeValue(Utility.ATTRIBUTE_SCHEMA, 
        Utility.ATTRIBUTE_TTF_KEY); 

      if (null != ttfName) 
       init(); 
     } 

    } 

    public CustomFontEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.mContext = context; 
    } 

    private void init() { 
     Typeface font = Utility.getFonts(mContext, ttfName); 
     if (null != font) 
      setTypeface(font); 
    } 

    @Override 
    public void setTypeface(Typeface tf) { 

     super.setTypeface(tf); 
    } 

} 

लोड और दुकान फ़ॉन्ट ताकि आप बाद में फॉन्ट का पुन: उपयोग कर सकते हैं। प्रत्येक बार नया लोड लोड होने पर फ़ॉन्ट लोड करने की कल्पना करें .. ओओएम .. !!!

private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>(); 
public static Typeface getFonts(Context context, String fontName) { 
    Typeface typeface = TYPEFACE.get(fontName); 
    if (typeface == null) { 
     typeface = Typeface.createFromAsset(context.getAssets(), "fonts/"+fontName); 
     TYPEFACE.put(fontName, typeface); 
    } 
    return typeface; 
} 

एक्सएमएल

public static final String ATTRIBUTE_TTF_KEY = "ttf_name"; 

public static final String ATTRIBUTE_SCHEMA = "http://schemas.android.com/apk/lib/com.exmaple.ui.customfont"; 

से फ़ॉन्ट सेट और अब अपने लेआउट फ़ाइल में उपयोग

<com.example.ui.customviews.CustomFontEditText 
      xmlns:font="http://schemas.android.com/apk/lib/com.exmaple.ui.customfont" 
      android:id="@+id/edt_pay_input" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="20dp" 
      android:background="@null" 
      android:cursorVisible="false" 
      android:drawableBottom="@drawable/dashed_white" 
      android:includeFontPadding="false" 
      android:inputType="numberDecimal" 
      android:maxLength="4" 
      android:minWidth="20dp" 
      android:singleLine="true" 
      android:textColor="@color/white" 
      android:textSize="30sp" 

      font:ttf_name="FedraSansStd-Light.otf" > 

      <requestFocus /> 
     </com.example.ui.customviews.CustomFontEditText> 

आप बटन के लिए भी ऐसा ही कर सकते हैं करने के लिए ttf विशेषता, TextView आदि

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