সম্পাদনা করুন : সুতরাং এটি একটি সময় হয়েছে, এবং আমি মনে করি যা এটি করার সবচেয়ে ভাল উপায়, এবং এক্সএমএল মাধ্যমে কম যোগ করতে চাই!
সুতরাং প্রথমে, আপনি একটি নতুন শ্রেণি তৈরি করতে চাইছেন যা আপনি নিজেরাই অনুকূলিত করতে চান এমন দৃশ্যকে ওভাররাইড করে। (যেমন কাস্টম টাইপফেসের সাথে একটি বোতাম চান? প্রসারিত 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);
}
}
এখন, আপনার যদি না থাকে তবে এর অধীনে একটি এক্সএমএল ডকুমেন্ট 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:
জন্য উপসর্গ এবং অ্যান্ড্রয়েড বৈশিষ্ট্যের উপসর্গ ব্যবহার করেন।
একটি শেষ জিনিস: আপনি যদি এটি কোনও স্টাইলে ( res/values/styles.xml
) ব্যবহার করতে চান তবে আপনার লাইনটি যুক্ত করা উচিত নয়xmlns:custom
। কোনও উপসর্গ ছাড়াই কেবল অ্যাট্রিবিটির নাম উল্লেখ করুন:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
অ্যান্ড্রয়েডে একটি কাস্টম টাইপফেস ব্যবহার করা
এটি সাহায্য করা উচিত। মূলত, এক্সএমএলে এটি করার কোনও উপায় নেই, এবং যতদূর আমি বলতে পারি, কোডে এটি করার সহজ উপায় নেই। আপনার কাছে সর্বদা একটি সেটলআউটফন্ট () পদ্ধতি থাকতে পারে যা একবার টাইপফেস তৈরি করে, তারপরে প্রতিটিটির জন্য সেট টাইপফেস () চালায়। আপনি যখনই কোনও বিন্যাসে নতুন আইটেম যুক্ত করবেন তখনই আপনাকে এটি আপডেট করতে হবে। নীচের মত কিছু:
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);
}
}
তারপরে, অনক্রিট () থেকে কেবল এই পদ্ধতিটি ব্যবহার করুন এবং আপনি আপডেট করতে চান এমন সমস্ত পাঠ্যদর্শনগুলি পাস করুন:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
সম্পাদনা 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);
}
}
যদি আপনি এটি আপনার বিন্যাসের মূলটি পাস করেন তবে এটি পুনরুক্তরূপে layout লেআউটের মধ্যে TextView
বা Button
(বা অন্য যে কোনও বিবৃতিতে আপনি যুক্ত করেছেন) তা অনুসন্ধান করবে এবং আইডি দ্বারা নির্দিষ্ট না করে ফন্ট সেট করবে। এটি অবশ্যই ধরে নিচ্ছে আপনি প্রতিটি ভিউতে ফন্ট সেট করতে চান ।