संपादित करें : तो यह एक समय हो गया है, और मैं जोड़ना चाहूंगा कि मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका है, और एक्सएमएल के माध्यम से कोई कम नहीं है!
तो सबसे पहले, आप एक नया वर्ग बनाना चाहते हैं जो आपके द्वारा अनुकूलित किए जाने वाले दृश्य को ओवरराइड करता है। (जैसे एक कस्टम टाइपफेस वाला बटन चाहते हैं? बढ़ाएँ Button
)। आइए एक उदाहरण बनाते हैं:
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);
}
}
अब, यदि आपके पास एक नहीं है, तो XML दस्तावेज़ को नीचे res/values/attrs.xml
जोड़ें, और जोड़ें:
<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>
ठीक है, इसलिए उस रास्ते से, चलो parseAttributes()
पहले से विधि पर वापस आते हैं :
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();
}
अब तुम बिलकुल तैयार हो गए। आप किसी भी चीज़ के बारे में और अधिक विशेषताएँ जोड़ सकते हैं (आप टाइपफेसिटाइल के लिए एक और एक जोड़ सकते हैं - बोल्ड, इटैलिक, आदि) लेकिन अब देखते हैं कि इसका उपयोग कैसे करें:
<?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>
xmlns:custom
लाइन वास्तव में कुछ भी हो सकता है, लेकिन सम्मेलन क्या ऊपर दिखाया जाता है। क्या मायने रखता है कि यह अद्वितीय है, और इसलिए पैकेज नाम का उपयोग किया जाता है। अब आप बस custom:
अपनी विशेषताओं के लिए उपसर्ग का उपयोग करें , और android:
Android विशेषताओं के लिए उपसर्ग का उपयोग करें ।
एक आखिरी बात: यदि आप इसे एक शैली ( res/values/styles.xml
) में उपयोग करना चाहते हैं , तो आपको लाइन नहीं जोड़ना चाहिए xmlns:custom
। बिना किसी उपसर्ग वाले विशेषता के नाम को देखें:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
Android में एक कस्टम टाइपफेस का उपयोग करना
यह मदद करनी चाहिए। मूल रूप से, XML में ऐसा करने का कोई तरीका नहीं है, और जहां तक मैं बता सकता हूं, कोड में इसे करने का कोई आसान तरीका नहीं है। आपके पास हमेशा एक सेटलाइटआउट () विधि हो सकती है जो एक बार टाइपफेस बनाता है, फिर प्रत्येक के लिए सेट टाइपफेस () चलाता है। जब आप किसी नए आइटम को लेआउट में जोड़ते हैं तो आपको हर बार इसे अपडेट करना होगा। नीचे कुछ इस तरह है:
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);
}
संपादित करें : तो मैं बस कुछ इस तरह से खुद को लागू करने के लिए चारों ओर हो गया, और मैं इसे कैसे समाप्त कर रहा हूं यह इस तरह से एक समारोह बना रहा था:
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
फिर, बस ऑनक्रिएट () से इस विधि का उपयोग करें, और उन सभी TextViews को पास करें जिन्हें आप अपडेट करना चाहते हैं:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
EDIT 9/5/12:
इसलिए चूंकि यह अभी भी विचारों और वोटों को प्राप्त कर रहा है, मैं एक बहुत बेहतर और अधिक पूर्ण विधि जोड़ना चाहूंगा:
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);
}
}
यदि आप इसे अपने लेआउट की जड़ से गुजारते हैं, तो यह उस लेआउट के भीतर पुनरावृत्ति TextView
या Button
दृश्य (या आपके द्वारा उस कथन में जोड़े गए किसी भी अन्य) के लिए जाँच करेगा , और बिना आईडी के उन्हें निर्दिष्ट किए बिना फ़ॉन्ट सेट करेगा। यह निश्चित रूप से आप हर दृश्य के लिए फ़ॉन्ट सेट करना चाहते हैं मान रहा है ।