সংক্ষিপ্ত উত্তর: নং অ্যান্ড্রয়েডের এক্সএমএল এর মাধ্যমে পাঠ্য উইজেটে কাস্টম ফন্টগুলি প্রয়োগ করার জন্য অন্তর্নির্মিত সমর্থন নেই।
তবে, এমন একটি কাজ রয়েছে যা বাস্তবায়ন করা মারাত্মকভাবে কঠিন নয়।
প্রথম
আপনার নিজের স্টাইলযোগ্য সংজ্ঞা দিতে হবে। আপনার / res / মান ফোল্ডারে, attrs.xML ফাইলটি খুলুন / তৈরি করুন এবং এর মতো একটি ঘোষিত-স্টাইলযোগ্য বস্তু যুক্ত করুন:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FontText">
<attr name="typefaceAsset" format="string"/>
</declare-styleable>
</resources>
দ্বিতীয়
ধরে নিই যে আপনি এই উইজেটটি প্রায়শই ব্যবহার করতে চান, আপনার বোঝা Typeface
বস্তুগুলির জন্য একটি সাধারণ ক্যাশে সেট আপ করা উচিত , কারণ ফ্লাইতে মেমরি থেকে এগুলি লোড করতে সময় নিতে পারে। কিছুটা এইরকম:
public class FontManager {
private static FontManager instance;
private AssetManager mgr;
private Map<String, Typeface> fonts;
private FontManager(AssetManager _mgr) {
mgr = _mgr;
fonts = new HashMap<String, Typeface>();
}
public static void init(AssetManager mgr) {
instance = new FontManager(mgr);
}
public static FontManager getInstance() {
if (instance == null) {
AssetManager assetManager = App.getContext().getAssets();
init(assetManager);
}
return instance;
}
public Typeface getFont(String asset) {
if (fonts.containsKey(asset))
return fonts.get(asset);
Typeface font = null;
try {
font = Typeface.createFromAsset(mgr, asset);
fonts.put(asset, font);
} catch (Exception e) {
}
if (font == null) {
try {
String fixedAsset = fixAssetFilename(asset);
font = Typeface.createFromAsset(mgr, fixedAsset);
fonts.put(asset, font);
fonts.put(fixedAsset, font);
} catch (Exception e) {
}
}
return font;
}
private String fixAssetFilename(String asset) {
if (TextUtils.isEmpty(asset))
return asset;
if ((!asset.endsWith(".ttf")) && (!asset.endsWith(".ttc")))
asset = String.format("%s.ttf", asset);
return asset;
}
}
এইটি আপনাকে .ttc ফাইল এক্সটেনশানগুলি ব্যবহার করার অনুমতি দেবে, তবে এটি নিরীক্ষিত।
তৃতীয়
একটি নতুন ক্লাস তৈরি করুন যা সাবক্লাস করে TextView
। এই নির্দিষ্ট উদাহরণটি নির্ধারিত এক্সএমএল টাইপফেস ( bold
, italic
ইত্যাদি) বিবেচনা করে এবং এটি ফন্টে প্রয়োগ করে (ধরে নিবেন আপনি একটি .ttc ফাইল ব্যবহার করছেন)।
public class FontText extends TextView {
public FontText(Context context) {
this(context, null);
}
public FontText(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FontText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (isInEditMode())
return;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.FontText);
if (ta != null) {
String fontAsset = ta.getString(R.styleable.FontText_typefaceAsset);
if (!TextUtils.isEmpty(fontAsset)) {
Typeface tf = FontManager.getInstance().getFont(fontAsset);
int style = Typeface.NORMAL;
float size = getTextSize();
if (getTypeface() != null)
style = getTypeface().getStyle();
if (tf != null)
setTypeface(tf, style);
else
Log.d("FontText", String.format("Could not create a font from asset: %s", fontAsset));
}
}
}
}
অবশেষে
TextView
আপনার এক্সএমএল এর উদাহরণগুলি পুরোপুরি যোগ্যতাসম্পন্ন শ্রেণীর নামের সাথে প্রতিস্থাপন করুন । আপনার কাস্টম নেমস্পেসটি ঠিক যেমন আপনার অ্যান্ড্রয়েড নেমস্পেসের মতো ঘোষণা করুন। নোট করুন যে "টাইপফেসএসেট" আপনার / সম্পত্তির ডিরেক্টরিতে থাকা একটি .ttf বা .ttc ফাইলকে নির্দেশ করবে।
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.FontText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a custom font text"
custom:typefaceAsset="fonts/AvenirNext-Regular.ttf"/>
</RelativeLayout>