পুরো অ্যাপ্লিকেশনটির জন্য কাস্টম ফন্ট সেট করা সম্ভব?


270

আমার পুরো অ্যাপ্লিকেশনটির জন্য আমাকে নির্দিষ্ট ফন্ট ব্যবহার করতে হবে। আমি একই জন্য .ttf ফাইল আছে। অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে এটিকে অ্যাপ্লিকেশনের অন্য কোথাও ব্যবহার করা কি ডিফল্ট ফন্ট হিসাবে সেট করা সম্ভব? সেট করা থাকলে, আমি কীভাবে এটি আমার লেআউট এক্সএমএলগুলিতে ব্যবহার করব?


অ্যান্ড্রয়েড স্টুডিও
in.০ এ

এক্সএমএলে এমএইচএসফিশার ফন্টগুলি অ্যান্ড্রয়েড 8.0 (এপিআই স্তর 26)
এমি রাজ এর বৈশিষ্ট্য

1
@ এমিরাজ দয়া করে ডক বিকাশকারী.অ্যান্ড্রয়েড / গাইড / টপিক্স / লুই / দৃষ্টিভঙ্গি এবং এফিল/… পড়ুন । এই বৈশিষ্ট্য সমর্থন গ্রন্থাগার 26 যোগ, কিন্তু এপিআই 16. থেকে সমর্থন
MHSFisher

উত্তর:


449

হ্যাঁ প্রতিচ্ছবি সহ। এটি কাজ করে ( এই উত্তরের ভিত্তিতে ):

(দ্রষ্টব্য: কাস্টম ফন্টগুলির পক্ষে সমর্থন না থাকার কারণে এটি একটি কার্যনির্বাহী, সুতরাং আপনি যদি এই পরিস্থিতিটি পরিবর্তন করতে চান তবে দয়া করে এখানে অ্যান্ড্রয়েড ইস্যুটি আপ-ভোট দেওয়ার জন্য স্টার করুন )। দ্রষ্টব্য: এই বিষয়ে "আমাকেও" মন্তব্যগুলি রাখবেন না, যারা এটিকে দেখেছে তারা সকলেই যখন আপনি এটি করেন তখন ইমেল পান। দয়া করে এটি কেবল "তারা" করুন।

import java.lang.reflect.Field;
import android.content.Context;
import android.graphics.Typeface;

public final class FontsOverride {

    public static void setDefaultFont(Context context,
            String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(),
                fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }

    protected static void replaceFont(String staticTypefaceFieldName,
            final Typeface newTypeface) {
        try {
            final Field staticField = Typeface.class
                    .getDeclaredField(staticTypefaceFieldName);
            staticField.setAccessible(true);
            staticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

তারপরে আপনাকে কয়েকটি ডিফল্ট ফন্টগুলি ওভারলোড করতে হবে, উদাহরণস্বরূপ অ্যাপ্লিকেশন শ্রেণিতে:

public final class Application extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
        FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");
        FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");
        FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");
    }
}

অথবা অবশ্যই যদি আপনি একই ফন্ট ফাইলটি ব্যবহার করেন তবে এটি একবারে লোড করার জন্য আপনি এটিতে উন্নতি করতে পারেন।

তবে আমি কেবল একটিটিকে ওভাররাইড করতে চাই, বলি "MONOSPACE", তারপরে সেই ফন্টের টাইপফেস অ্যাপ্লিকেশনটিকে প্রশস্ত করতে একটি স্টাইল সেট আপ করুন:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:typeface">monospace</item>
    </style>
</resources>

API 21 Android 5.0

আমি মন্তব্যগুলিতে প্রতিবেদনগুলি তদন্ত করেছি যে এটি কাজ করে না এবং এটি থিমের সাথে বেমানান বলে মনে হচ্ছে android:Theme.Material.Light

যদি থিমটি আপনার পক্ষে গুরুত্বপূর্ণ না হয় তবে একটি পুরানো থিম ব্যবহার করুন, যেমন:

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

11
আপনি মনোস্পেসকে সাহসী বা তির্যক কীভাবে ওভাররাইড করবেন?
ক্রিস্টোফার রিভেরা

2
@ ক্রিস্টোফেরাইভেরা এখানে "DEFAULT_BOLD"একটি ব্যক্তিগত ক্ষেত্র রয়েছে: private static Typeface[] sDefaults;আপনি প্রতিফলন এবং sDefaults[Typeface.ITALIC]আপনার টাইপফাইজে সেট করে এটি অ্যাক্সেস করার চেষ্টা করতে পারেন। এই
ওয়েস্টন

5
@ ওয়েস্টন কিছু মনে করবেন না। আমি এটা অর্জন করেছি। আমার বোঝার মধ্যে একটি ভুল ছিল। তুমি চমৎকার কাজ করেছো। তুমি কি আমাকে একটা কথা বলতে পার? কেন এটি ডিফল্ট টাইপফেসের জন্য কাজ করছে না? আমি আপনার পরামর্শ হিসাবে টাইপফেসটিকে মনসস্পেসে পরিবর্তন করেছি এবং তারপরে লিংকটি প্রয়োগ করব, এটি কার্যকর হয়েছে। কিন্তু ডিফল্টের জন্য কাজ করছেন না
জয় পান্ড্য

2
নেটিভ টাইপফেস ত্রুটি করা যায় না। ফন্টের পথ যুক্ত করে স্থির করা হয়েছে। "ফন্টস ওভাররাইড.সেট ডিফল্টফন্ট (এটি," ডিফল্ট "," হরফ / মাইফন্টএসেট.টিটিএফ ");"
সাঁই

3
আমি TextViewকাস্টম ফন্টগুলি ব্যবহার করতে বা এর মতো প্রতিবিম্বিত ভিত্তিক সমাধানটি ব্যবহার করতে ডিফল্টটিকে সর্বত্র বদলাতে সত্যিই বিরক্তিকর বলে মনে করি । অ্যান্ড্রয়েডে উপলব্ধ ফন্টগুলির সীমাবদ্ধ সেটগুলির সাথে মিলিত, এটি দুর্দান্ত দেখানোর অ্যাপগুলিকে বিকাশ করে তোলে প্রচুর পরিশ্রম। আমি অ্যান্ড্রয়েড ইস্যু ট্র্যাকারে একটি বৈশিষ্ট্য অনুরোধ যুক্ত করেছি। আপনি যদি এই বৈশিষ্ট্যটি দেখতে চান তবে আপনি এখানে সমস্যাটি তারকাচিহ্নিত করতে পারেন: কোড. google.com/p/android/issues/…
স্যাম

64

অ্যান্ড্রয়েডে কাস্টম ফন্টগুলির জন্য একটি দুর্দান্ত গ্রন্থাগার রয়েছে: ক্যালিগ্রাফি

এটি কীভাবে ব্যবহার করবেন তা এখানে একটি নমুনা।

গ্রেডলে আপনার এই লাইনটি আপনার অ্যাপের বিল্ড.gradle ফাইলে রাখতে হবে:

dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.2.0'
}

এবং তারপরে একটি শ্রেণি তৈরি করুন যা Applicationএই কোডটি প্রসারিত করে লিখবে:

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath("your font path")
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );
    }
} 

এবং ক্রিয়াকলাপ শ্রেণিতে এই পদ্ধতিটি অনক্রিটের আগে রাখুন:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

এবং আপনার ম্যানিফেস্ট ফাইলটি শেষ জিনিসটি দেখতে এমন হওয়া উচিত:

<application
   .
   .
   .
   android:name=".App">

এবং এটি আপনার ক্রিয়াকলাপটি আপনার ফন্টে বদলে দেবে! এটা সহজ এবং পরিষ্কার!


1
এই নিখুঁত সমাধান।
nizam.sp

1
সত্য, এর একেবারে নিখুঁত সমাধান, এইভাবে আমাকে মেনু আইটেম, রেডিও বোতাম বা চেকবক্স ফটনের জন্য ফন্টগুলি আপডেট করতে বিভিন্ন ক্লাস লিখতে হবে না। এটি সবার জন্য প্রযোজ্য !! ধন্যবাদ :)
মনীষা

2
অবশ্যই একটি নিখুঁত সমাধান নয়: বোল্ড / ইটালিক / গা bold়-ইটালিক শৈলীগুলি ওভাররাইট করা হয়। এই পরিবারগুলিকে সেট করার কোনও সহজ উপায় বর্তমানে নেই।
0101100101

2
আমি যদি তা করি তবে আমি কীভাবে বোল্ড থেকে নিয়মিত স্যুইচ করতে পারি?
GMX

2
, সাহসী ইটালিক বা নিম্নরেখা বৈশিষ্ট্যটি পেতে, আমি ব্যবহার করেছি <b></b>, <u></u>এবং <i></i>মধ্যে strings.xmlফাইল এবং এ পর্যন্ত এটি কাজ করে।
jlively

47

যদিও এটি পুরো অ্যাপ্লিকেশনটির জন্য কাজ করে না, এটি কোনও ক্রিয়াকলাপের জন্য কাজ করে এবং অন্য কোনও ক্রিয়াকলাপের জন্য এটি পুনরায় ব্যবহার করা যেতে পারে। অন্যান্য ভিউগুলিকে সমর্থন করার জন্য আমি আমার কোড @ FR073N ধন্যবাদ আপডেট করেছি। আমি বিষয় সম্পর্কে নিশ্চিত নই Buttons, RadioGroupsকারণ সেই শ্রেণীর সব প্রসারিত, ইত্যাদি TextViewতাই তারা ঠিক সূক্ষ্ম কাজ করা উচিত। আমি প্রতিবিম্বটি ব্যবহারের জন্য একটি বুলিয়ান শর্তযুক্ত যুক্ত করেছি কারণ এটি খুব হ্যাকিশ বলে মনে হচ্ছে এবং সম্ভবত পারফরম্যান্সে আপস করবে।

দ্রষ্টব্য: হিসাবে নির্দেশিত, এটি গতিশীল সামগ্রীর জন্য কাজ করবে না! তার জন্য, একটি পদ্ধতি onCreateViewবা বলার সাথে এই পদ্ধতিটি কল করা সম্ভব getView, তবে অতিরিক্ত প্রচেষ্টা প্রয়োজন।

/**
 * Recursively sets a {@link Typeface} to all
 * {@link TextView}s in a {@link ViewGroup}.
 */
public static final void setAppFont(ViewGroup mContainer, Typeface mFont, boolean reflect)
{
    if (mContainer == null || mFont == null) return;

    final int mCount = mContainer.getChildCount();

    // Loop through all of the children.
    for (int i = 0; i < mCount; ++i)
    {
        final View mChild = mContainer.getChildAt(i);
        if (mChild instanceof TextView)
        {
            // Set the font if it is a TextView.
            ((TextView) mChild).setTypeface(mFont);
        }
        else if (mChild instanceof ViewGroup)
        {
            // Recursively attempt another ViewGroup.
            setAppFont((ViewGroup) mChild, mFont);
        }
        else if (reflect)
        {
            try {
                Method mSetTypeface = mChild.getClass().getMethod("setTypeface", Typeface.class);
                mSetTypeface.invoke(mChild, mFont); 
            } catch (Exception e) { /* Do something... */ }
        }
    }
}

তারপরে এটি ব্যবহার করতে আপনি এই জাতীয় কিছু করবেন:

final Typeface mFont = Typeface.createFromAsset(getAssets(),
"fonts/MyFont.ttf"); 
final ViewGroup mContainer = (ViewGroup) findViewById(
android.R.id.content).getRootView();
HomeActivity.setAppFont(mContainer, mFont);

আশা করি এইটি কাজ করবে.


4
আমি মনে করি পাঠ্যদর্শনটি ওভাররাইড করা সবচেয়ে ভাল উপায়। আপনার প্রচুর মতামত সহ একটি অ্যাপ্লিকেশন থাকলে এই পদ্ধতিটি কিছুটা নিরর্থক হতে পারে।
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

1
এটি হতে পারে ... তবে অ্যান্ড্রয়েড চশমা অনুসারে আপনি 4 স্তরের গভীর এবং 100 টি প্রশস্ত প্রশস্ত লেআউটগুলি এড়াতে চান (এমনকি এটি বেশ খানিকটা কম)। পারফরম্যান্সের ক্ষেত্রে পুনরাবৃত্তি খারাপ হতে পারে, তবে আপনার লেআউটটি 20 স্তরের ছিল যা এমনকি তাৎপর্যপূর্ণ নয়।
টম

আমি একমত হব যে এর পারফোমেন্সে কোনও লক্ষণীয় প্রভাব নেই এবং আমি আপনার উত্তরটি ভুল বলে বলার চেষ্টা করছি না। আমার প্রয়োজন না হলে লেআউটের প্রতিটি দৃশ্য দিয়ে সাইকেল চালানো পছন্দ করি না। এছাড়াও, টেক্সটভিউ প্রসারিত করে, আপনি যদি অন্য উপায়ে উপস্থিতিটি পরিবর্তন করতে চান তবে আপনাকে কেবল একটি স্পটে কোড পরিবর্তন করতে হবে।
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

1
উপরের কোডটি কেবলমাত্র টেক্সটভিউগুলি অন্তর্ভুক্ত করতে চেয়েছিল তবে তালিকাগুলি, সতর্কতা, টোস্টস, মানচিত্র চিহ্নিতকারীগণ এখনও সিস্টেম ফন্ট ব্যবহার করবে।
csch

2
ছেলেরা এই ফাংশনটি 3 পরামিতি নেয়, যখন আপনি এটি পুনরাবৃত্তি বলবেন আপনি 2 প্যারামিটার পাস করেছেন ??? কোনটি সঠিক? কি প্রতিফলিত হয় ??
এমবিএইচ

34

সংক্ষেপে:

বিকল্প # 1: হরফ প্রয়োগ করতে প্রতিবিম্বটি ব্যবহার করুন ( ওয়েস্টন এবং রজার হুয়াংয়ের উত্তর সংযুক্ত করে):

import java.lang.reflect.Field;
import android.content.Context;
import android.graphics.Typeface;

public final class FontsOverride { 

    public static void setDefaultFont(Context context,
            String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(),
                fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    } 

    protected static void replaceFont(String staticTypefaceFieldName,final Typeface newTypeface) {
        if (isVersionGreaterOrEqualToLollipop()) {
            Map<String, Typeface> newMap = new HashMap<String, Typeface>();
            newMap.put("sans-serif", newTypeface);
            try {
                final Field staticField = Typeface.class.getDeclaredField("sSystemFontMap");
                staticField.setAccessible(true);
                staticField.set(null, newMap);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            try {
                final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
                staticField.setAccessible(true);
                staticField.set(null, newTypeface);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } 
        }
    }

} 

প্রয়োগ শ্রেণিতে ব্যবহার:

public final class Application extends android.app.Application {
    @Override 
    public void onCreate() { 
        super.onCreate(); 
        FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
        FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");
        FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");
        FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");
    } 
} 

এই ফন্ট টাইপফেস অ্যাপ্লিকেশন প্রশস্ত করতে একটি স্টাইল সেট আপ করুন ( লাভফিশের উপর ভিত্তি করে ):

প্রি-Lollipop এ:

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

   <!-- Application theme. -->
   <style name="AppTheme" parent="AppBaseTheme">
       <item name="android:typeface">monospace</item>
   </style>
</resources>

ললিপপ (এপিআই 21):

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

   <!-- Application theme. -->
   <style name="AppTheme" parent="AppBaseTheme">
       <item name="android:textAppearance">@style/CustomTextAppearance</item>
   </style>

   <style name="CustomTextAppearance">
       <item name="android:typeface">monospace</item>
   </style>
</resources>

বিকল্প 2: প্রতিটি ফোকাস যেখানে আপনার হরফ কাস্টমাইজ করতে হবে প্রতিটি ভিউ, অর্থাৎ। লিস্টভিউ, এডিটটেক্সটভিউ, বাটন ইত্যাদি ( প্যালানীর উত্তর):

public class CustomFontView extends TextView {

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

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

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

private void init() { 
    if (!isInEditMode()) {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "Futura.ttf");
        setTypeface(tf);
    } 
} 

বিকল্প 3: একটি ভিউ ক্রোলার প্রয়োগ করুন যা আপনার বর্তমান স্ক্রিনের ভিউ হায়ারার্কির মধ্য দিয়ে যায়:

প্রকরণ # 1 ( টমের উত্তর):

public static final void setAppFont(ViewGroup mContainer, Typeface mFont, boolean reflect)
{ 
    if (mContainer == null || mFont == null) return;

    final int mCount = mContainer.getChildCount();

    // Loop through all of the children. 
    for (int i = 0; i < mCount; ++i)
    { 
        final View mChild = mContainer.getChildAt(i);
        if (mChild instanceof TextView)
        { 
            // Set the font if it is a TextView. 
            ((TextView) mChild).setTypeface(mFont);
        } 
        else if (mChild instanceof ViewGroup)
        { 
            // Recursively attempt another ViewGroup. 
            setAppFont((ViewGroup) mChild, mFont);
        } 
        else if (reflect)
        { 
            try { 
                Method mSetTypeface = mChild.getClass().getMethod("setTypeface", Typeface.class);
                mSetTypeface.invoke(mChild, mFont); 
            } catch (Exception e) { /* Do something... */ }
        } 
    } 
} 

ব্যবহার:

final ViewGroup mContainer = (ViewGroup) findViewById(
android.R.id.content).getRootView();
HomeActivity.setAppFont(mContainer, Typeface.createFromAsset(getAssets(),
"fonts/MyFont.ttf"));

প্রকরণ # 2: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere

অপশন # 4: ব্যবহার করুন 3 য় পার্টি প্রচ্ছদ নামক হাতের লেখা

ব্যক্তিগতভাবে, আমি বিকল্প # 4 সুপারিশ করব, কারণ এটি প্রচুর মাথা ব্যথা বাঁচায়।


ইন অপশন # 1 , আপনি কি বোঝাতে চেয়েছেন দ্বারা "sans-serif"মধ্যে newMap.put(, এবং monospaceমধ্যে styles! আমি নামের একটি কাস্টম ফন্ট ব্যবহার করতে চাই barana.ttf
ডাঃ জ্যাকি

বিকল্প 1-এ, প্রথম কোড স্নিপেট এপিআই স্তরের 22, অ্যান্ড্রয়েড 5.1.1 এর সাথে কাজ করে না। তবে অন্যান্য কোড বিভাগটি করে। শর্ত থাকলে ঠিক কী হওয়া উচিত?
ব্যবহারকারী 1510006

28

আমি ওয়েস্টন উন্নতি করতে চাই API 21 Android 5.0 এর উত্তরটি answer

কারণ

এপিআই 21 এর অধীনে, বেশিরভাগ পাঠ্য শৈলে ফন্টফ্যামিলি সেটিং অন্তর্ভুক্ত থাকে:

<style name="TextAppearance.Material">
     <item name="fontFamily">@string/font_family_body_1_material</item>
</style>

যা ডিফল্ট রোবোটো নিয়মিত ফন্ট প্রয়োগ করে:

<string name="font_family_body_1_material">sans-serif</string>

মূল উত্তরটি মনসস্পেস ফন্ট প্রয়োগ করতে ব্যর্থ হয়েছে, কারণ অ্যান্ড্রয়েড: ফন্টফ্যামিলির অ্যান্ড্রয়েডের প্রতি বেশি অগ্রাধিকার রয়েছে: টাইপফেস অ্যাট্রিবিউট ( রেফারেন্স) ) । থিম.হলো। * ব্যবহার করা একটি বৈধ কাজ, কারণ কোনও অ্যান্ড্রয়েড নেই: ফন্টফ্যামিলি সেটিংস ভিতরে inside

সমাধান

যেহেতু অ্যান্ড্রয়েড 5.0 স্ট্যাটিক ভেরিয়েবল টাইপফেসে.সিসটেমফন্টম্যাপ ( রেফারেন্স ) এ সিস্টেম টাইপফেস রাখে , আমরা এটি প্রতিস্থাপনের জন্য একই প্রতিচ্ছবি কৌশলটি ব্যবহার করতে পারি:

protected static void replaceFont(String staticTypefaceFieldName,
        final Typeface newTypeface) {
    if (isVersionGreaterOrEqualToLollipop()) {
        Map<String, Typeface> newMap = new HashMap<String, Typeface>();
        newMap.put("sans-serif", newTypeface);
        try {
            final Field staticField = Typeface.class
                    .getDeclaredField("sSystemFontMap");
            staticField.setAccessible(true);
            staticField.set(null, newMap);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    } else {
        try {
            final Field staticField = Typeface.class
                    .getDeclaredField(staticTypefaceFieldName);
            staticField.setAccessible(true);
            staticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

4
তবে, আমি ভাবছি কেন এটি আমার Buttonও সরঞ্জাম বারের শিরোনামগুলির জন্য কাজ করে না বলে মনে হচ্ছে । নিম্নরূপ আমি MainApplication এ ডিফল্ট ফন্ট অগ্রাহ্য করছি: FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");। আমি Nexus 5, v5.1.1
কিপ 2

3
আরে, আপনাকে ধন্যবাদ এটি খুব সহায়ক ছিল, কেবল একটি জিনিস: এটি অ্যান্ড্রয়েড 6 (এপিআই 22) এ কাজ করে না। তারপরে কোডটি এতে পরিবর্তন করা উচিত: Build.VERSION.SDK_INT == 21- এটি API 21 নেক্সাসে
আইপিএল

এখনও আমি নেক্সাস 9 এ এই পদ্ধতিটি ব্যবহার করে কাস্টম ফন্ট সেট করতে পারছি না
রাহুল উপাধ্যায়

2
5.1+ এর জন্য কাজ না করে যে কোনও সমস্যা হচ্ছে। আপনার মান-v21 শৈলীতে টাইপফেসটি ওভাররাইড করবেন না।
মুহাম্মদ বাবর

@ মুহম্মদবাবার ধন্যবাদ আপনার সমাধানটি আমার দিনটি তৈরি করেছে
এম.ওয়েশ্বর্বরণ

15

এটি খুব সাধারণ ... 1. ডাউনলোড করুন এবং সম্পদে আপনার কাস্টম ফন্টটি রাখুন..এরপরে পাঠ্য দর্শনের জন্য একটি পৃথক শ্রেণি লিখুন: আমি এখানে ফুতুরা ফন্ট ব্যবহার করেছি

public class CusFntTextView extends TextView {

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

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

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

private void init() {
    if (!isInEditMode()) {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "Futura.ttf");
        setTypeface(tf);
    }
}

}

এবং নিম্নলিখিত এক্সএমএলে করুন:

 <com.packagename.CusFntTextView
        android:id="@+id/tvtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"         
        android:text="Hi Android"           
        android:textAppearance="?android:attr/textAppearanceLarge"
      />

হ্যাঁ, এটি কাজ করে :) তবে, আমি যদি অন্য অবশিষ্ট ভিউ / উইজেটগুলির জন্য একই ফন্টগুলি প্রয়োগ করতে চাই? অন্যান্য ডায়লগ (ডায়লগ / টোস্ট / অ্যাকশনবার্স সহ) এর জন্যও কি আমার আলাদা ক্লাস লেখার দরকার আছে?
নরেন্দ্র সিং

হ্যাঁ, এই সমাধানের জন্য আপনার নিজের প্রতিটি দর্শনের জন্য পৃথক ক্লাস লিখতে হবে।
সাদ বিলাল

9

আমি টেক্সটভিউ এবং অন্যান্য নিয়ন্ত্রণগুলি প্রসারিত করার পরামর্শ দিচ্ছি, তবে কনস্ট্রাক্টসে ফন্ট সেটআপ করার বিষয়টি বিবেচনা করা ভাল।

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

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

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

protected void init() {
    setTypeface(Typeface.createFromAsset(getContext().getAssets(), AppConst.FONT));
}

2
প্ল্যাটফর্মগুলিতে 4.0 এর আগে এটি করার সময় সাবধানতা অবলম্বন করুন - এটি অ্যান্ড্রয়েডে বাগের কারণে প্রচুর সংস্থান ফাঁস হবে: কোড. google.com/p/android/issues/detail?id=9904
রায়ান এম

আমরা কীভাবে ডিফল্টে ফিরে যেতে পারি। আমি এর মতো কিছু করছি: যদি (configShared.getString ("storeId", AppCredentials.DEFAULT_STORE_ID) .সম্পাদনা ("2")) {চূড়ান্ত ক্ষেত্রের স্ট্যাটিকফিল্ড = টাইপফেস.ক্লাস.সেট ডেক্লেয়ার্ডফিল্ড (স্ট্যাটিক টাইপফেসফিল্ডনেম); staticField.setAccessible (সত্য); স্ট্যাটিকফিল্ড.সেট (নাল, নিউ টাইপফেস); } অন্য {চূড়ান্ত ক্ষেত্র স্ট্যাটিকফিল্ড = Typeface.class.getDeclaredField (স্ট্যাটিক টাইপফেসফিল্ডনেম); staticField.setAccessible (সত্য); স্ট্যাটিকফিল্ড.সেট (নাল, নাল); }
খুনি

8

আমি উন্নতি করতে চাই Weston 's এবং রজার হুয়াং এর এপিআই উপর 21 থিম "সঙ্গে Android Lollipop উত্তর Theme.AppCompat "।

অ্যান্ড্রয়েড ৪.৪ এর নিচে

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

   <!-- Application theme. -->
   <style name="AppTheme" parent="AppBaseTheme">
       <item name="android:typeface">monospace</item>
   </style>
</resources>

ওভার (সমান) এপিআই 5.0

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

   <!-- Application theme. -->
   <style name="AppTheme" parent="AppBaseTheme">
       <item name="android:textAppearance">@style/CustomTextAppearance</item>
   </style>

   <style name="CustomTextAppearance">
       <item name="android:typeface">monospace</item>
   </style>
</resources>

আর FontsOverride ফাইল util হিসাবে কি একই Weston এর উত্তর। আমি এই ফোনে পরীক্ষা করেছি:

নেক্সাস 5 (অ্যান্ড্রয়েড 5.1 প্রাথমিক অ্যান্ড্রয়েড সিস্টেম)

জেডটিই ভি 5 (অ্যান্ড্রয়েড 5.1 সিএম 12.1)

XiaOMI নোট (অ্যান্ড্রয়েড 4.4 MIUI6)

HUAWEI C8850 (Android 2.3.5 অজানা)


8

একটি উজ্জ্বল সমাধানটি এখানে পাওয়া যাবে: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-e Everybody

বেসঅ্যাক্টিভিটি থেকে কেবল ক্রিয়াকলাপ প্রসারিত করুন এবং সেই পদ্ধতিগুলি লিখুন। এছাড়াও এখানে বর্ণিত হিসাবে আপনার আরও ভাল ক্যাশে ফন্টগুলি করা উচিত: https://stackoverflow.com/a/16902532/2914140


কিছু গবেষণার পরে আমি কোড লিখেছিলাম যা স্যামসাং গ্যালাক্সি ট্যাব এ (অ্যান্ড্রয়েড 5.0) এ কাজ করে। ওয়েস্টন এবং রজার হুয়াং এর পাশাপাশি https://stackoverflow.com/a/33236102/2914140 এর ব্যবহৃত কোড । লেনোভো ট্যাব 2 এ 10-70 এল-তেও পরীক্ষা করা হয়েছে, যেখানে এটি কাজ করে না। আমি এখানে একটি কমিক দেখতে একটি ফন্ট 'কমিক সানস' inোকালাম।

import android.content.Context;
import android.graphics.Typeface;
import android.os.Build;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class FontsOverride {
    private static final int BOLD = 1;
    private static final int BOLD_ITALIC = 2;
    private static final int ITALIC = 3;
    private static final int LIGHT = 4;
    private static final int CONDENSED = 5;
    private static final int THIN = 6;
    private static final int MEDIUM = 7;
    private static final int REGULAR = 8;

    private Context context;

    public FontsOverride(Context context) {
        this.context = context;
    }

    public void loadFonts() {
        Map<String, Typeface> fontsMap = new HashMap<>();
        fontsMap.put("sans-serif", getTypeface("comic.ttf", REGULAR));
        fontsMap.put("sans-serif-bold", getTypeface("comic.ttf", BOLD));
        fontsMap.put("sans-serif-italic", getTypeface("comic.ttf", ITALIC));
        fontsMap.put("sans-serif-light", getTypeface("comic.ttf", LIGHT));
        fontsMap.put("sans-serif-condensed", getTypeface("comic.ttf", CONDENSED));
        fontsMap.put("sans-serif-thin", getTypeface("comic.ttf", THIN));
        fontsMap.put("sans-serif-medium", getTypeface("comic.ttf", MEDIUM));
        overrideFonts(fontsMap);
    }

    private void overrideFonts(Map<String, Typeface> typefaces) {
        if (Build.VERSION.SDK_INT == 21) {
            try {
                final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
                field.setAccessible(true);
                Map<String, Typeface> oldFonts = (Map<String, Typeface>) field.get(null);
                if (oldFonts != null) {
                    oldFonts.putAll(typefaces);
                } else {
                    oldFonts = typefaces;
                }
                field.set(null, oldFonts);
                field.setAccessible(false);
            } catch (Exception e) {
                Log.e("TypefaceUtil", "Cannot set custom fonts");
            }
        } else {
            try {
                for (Map.Entry<String, Typeface> entry : typefaces.entrySet()) {
                    final Field staticField = Typeface.class.getDeclaredField(entry.getKey());
                    staticField.setAccessible(true);
                    staticField.set(null, entry.getValue());
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    private Typeface getTypeface(String fontFileName, int fontType) {
        final Typeface tf = Typeface.createFromAsset(context.getAssets(), "fonts/" + fontFileName);
        return Typeface.create(tf, fontType);
    }
}

পুরো অ্যাপ্লিকেশনটিতে কোডটি চালনার জন্য আপনাকে নিম্নলিখিত শ্রেণীর প্রয়োগের মতো কয়েকটি শ্রেণিতে লিখতে হবে:

    new FontsOverride(this).loadFonts();

'সম্পত্তির' ভিতরে একটি ফোল্ডার তৈরি করুন এবং প্রয়োজনীয় ফন্টগুলি সেখানে রাখুন। একটি সাধারণ নির্দেশ এখানে পাওয়া যেতে পারে: https://stackoverflow.com/a/31697103/2914140

লেনোভো ডিভাইসটিও ভুলভাবে একটি টাইপফেসের মান পায়। বেশিরভাগ সময়ে এটি টাইপফেসটি ফিরে আসে N সাধারণ, কখনও কখনও শূন্য। এমনকি যদি কোনও টেক্সটভিউ সাহসী হয় (এক্সএমএল-ফাইলের বিন্যাসে)। এখানে দেখুন: টেক্সটভিউ isBold সর্বদা সাধারণ প্রদান করে । এইভাবে কোনও স্ক্রিনে একটি পাঠ্য সবসময় নিয়মিত ফন্টে থাকে, সাহসী বা তির্যক নয়। সুতরাং আমি মনে করি এটি একটি প্রযোজকের বাগ।


আমি অ্যান্ড্রয়েড উত্স কোড অধ্যয়ন করেছি, আপনার উত্তরটি সেরা সেরা। এটি পাতলা, মাঝারি, হালকা বা অন্য যে কোনও কিছু প্রতিস্থাপন করতে পারে। তোমাকে অনেক ধন্যবাদ!
মোহাম্মদ ওমিদ্বর

6

জামারিন.এন্ড্রয়েডের জন্য কাজ করা:

ক্লাস:

public class FontsOverride
{
    public static void SetDefaultFont(Context context, string staticTypefaceFieldName, string fontAssetName)
    {
        Typeface regular = Typeface.CreateFromAsset(context.Assets, fontAssetName);
        ReplaceFont(staticTypefaceFieldName, regular);
    }

    protected static void ReplaceFont(string staticTypefaceFieldName, Typeface newTypeface)
    {
        try
        {
            Field staticField = ((Java.Lang.Object)(newTypeface)).Class.GetDeclaredField(staticTypefaceFieldName);
            staticField.Accessible = true;
            staticField.Set(null, newTypeface);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

প্রয়োগ বাস্তবায়ন:

namespace SomeAndroidApplication
{
    [Application]
    public class App : Application
    {
        public App()
        {

        }

        public App(IntPtr handle, JniHandleOwnership transfer)
            : base(handle, transfer)
        {

        }

        public override void OnCreate()
        {
            base.OnCreate();

            FontsOverride.SetDefaultFont(this, "MONOSPACE", "fonts/Roboto-Light.ttf");
        }
    }
}

শৈলী:

<style name="Theme.Storehouse" parent="Theme.Sherlock">
    <item name="android:typeface">monospace</item>
</style>

6

অ্যান্ড্রয়েড ও হিসাবে এটি এখন এক্সএমএল থেকে সরাসরি সংজ্ঞা দেওয়া সম্ভব এবং আমার বাগ এখন বন্ধ হয়ে গেছে!

বিশদ জন্য এখানে দেখুন

টি এল; ডিআর:

প্রথমে আপনাকে অবশ্যই আপনার ফন্টগুলি প্রকল্পে যুক্ত করতে হবে

দ্বিতীয়ত আপনি একটি ফন্ট পরিবার যুক্ত করুন, এর মতো:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>

শেষ পর্যন্ত, আপনি একটি বিন্যাস বা শৈলীতে হরফ ব্যবহার করতে পারেন:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/lobster"/>

<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
    <item name="android:fontFamily">@font/lobster</item>
</style>

উপভোগ করুন!


ধন্যবাদ। ফন্ট ফোল্ডার যুক্ত করতে আমাদের অ্যান্ড্রয়েড স্টুডিও ২.৪ ব্যবহার করা উচিত।
ফোটন পয়েন্ট

আসলে আমার এটি কেবল আমার স্টাইলে প্রয়োগ করা দরকার এবং এটি প্রয়োগের মাধ্যমে প্রয়োগ করা হবে। তবে কিছু (জাভা কোডের মাধ্যমে প্রোগ্রামযুক্ত যুক্ত নিয়ন্ত্রণগুলি প্রয়োগ করা দরকার)
সলিডসনেকে

4

আপনি প্রতিটি বিন্যাসের রুট ভিউটি পেরিয়ে একটি বিন্যাসের মাধ্যমে প্রতিটি বিন্যাসের জন্য কাস্টম ফন্টগুলি সেট করতে পারেন irst প্রথমত, ফন্টের অবজেক্টটিতে অ্যাক্সেসের জন্য সিনগেল্টন পদ্ধতি তৈরি করুন

 public class Font {
    private static Font font;
    public Typeface ROBO_LIGHT;

    private Font() {

    }

    public static Font getInstance(Context context) {
        if (font == null) {
            font = new Font();
            font.init(context);
        }
        return font;

    }

    public void init(Context context) {

        ROBO_LIGHT = Typeface.createFromAsset(context.getAssets(),
                "Roboto-Light.ttf");
    }

}

আপনি উপরের শ্রেণিতে বিভিন্ন ফন্ট সংজ্ঞায়িত করতে পারেন, এখন একটি ফন্ট হেল্পার শ্রেণি সংজ্ঞায়িত করুন যা ফন্টগুলি প্রয়োগ করবে:

   public class FontHelper {

    private static Font font;

    public static void applyFont(View parentView, Context context) {

        font = Font.getInstance(context);

        apply((ViewGroup)parentView);

    }

    private static void apply(ViewGroup parentView) {
        for (int i = 0; i < parentView.getChildCount(); i++) {

            View view = parentView.getChildAt(i);

//You can add any view element here on which you want to apply font 

            if (view instanceof EditText) {

                ((EditText) view).setTypeface(font.ROBO_LIGHT);

            }
            if (view instanceof TextView) {

                ((TextView) view).setTypeface(font.ROBO_LIGHT);

            }

            else if (view instanceof ViewGroup
                    && ((ViewGroup) view).getChildCount() > 0) {
                apply((ViewGroup) view);
            }

        }

    }

}

উপরের কোডে, আমি কেবলমাত্র টেক্সটভিউ এবং এডিটটেক্সটে ফন্ট প্রয়োগ করছি, আপনি অন্যান্য ভিউ উপাদানগুলিতে একইভাবে একইভাবে ফন্টগুলি প্রয়োগ করতে পারেন You উপরের প্রয়োগ ফন্টের পদ্ধতিতে আপনাকে আপনার রুট ভিউ গ্রুপের আইডিটি পাস করতে হবে। উদাহরণস্বরূপ আপনার লেআউটটি হ'ল:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/mainParent"
    tools:context="${relativePackage}.${activityClass}" >

    <RelativeLayout
        android:id="@+id/mainContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/homeFooter"
        android:layout_below="@+id/edit" >

        <ImageView
            android:id="@+id/PreviewImg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/abc_list_longpressed_holo"
            android:visibility="gone" />

        <RelativeLayout
            android:id="@+id/visibilityLayer"
            android:layout_width="match_parent"
            android:layout_height="fill_parent" >

            <ImageView
                android:id="@+id/UseCamera"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:src="@drawable/camera" />

            <TextView
                android:id="@+id/tvOR"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/UseCamera"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="20dp"
                android:text="OR"
                android:textSize="30dp" />

            <TextView
                android:id="@+id/tvAND"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="20dp"
                android:text="OR"
                android:textSize="30dp" />

</RelativeLayout>

উপরের লেআউটে মূল অভিভাবক আইডিটি "মেন প্যারেন্ট" এখন হরফ প্রয়োগ করতে দেয়

public class MainActivity extends BaseFragmentActivity {

    private EditText etName;
    private EditText etPassword;
    private TextView tvTitle;
    public static boolean isHome = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       Font font=Font.getInstance(getApplicationContext());
        FontHelper.applyFont(findViewById(R.id.mainParent),          getApplicationContext());
   }    
}

চিয়ার্স :)


সুন্দর .. আর একই ফন্ট আর তৈরি করা হবে না, সমস্ত ক্ষেত্রে শুধুমাত্র 1 ফন্ট ব্যবহার করুন। :)
আরফান মির্জা

3

আমি টেক্সটভিউ প্রসারিত করার পরামর্শ দিচ্ছি এবং সর্বদা আপনার এক্সএমএল লেআউটের ভিতরে বা যেখানেই আপনার পাঠ্যদর্শন প্রয়োজন সেখানে আপনার কাস্টম টেক্সটভিউটি ব্যবহার করার পরামর্শ দিচ্ছি। আপনার কাস্টম টেক্সটভিউতে ওভাররাইড করুনsetTypeface

@Override
public void setTypeface(Typeface tf, int style) {
    //to handle bold, you could also handle italic or other styles here as well
    if (style == 1){
        tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "MuseoSans700.otf");
    }else{
        tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "MuseoSans500.otf");
    }
    super.setTypeface(tf, 0);
}

2

টমের সমাধান দুর্দান্ত কাজ করে তবে কেবল টেক্সটভিউ এবং এডিটটেক্সট দিয়ে কাজ করে।

আপনি যদি বেশিরভাগ দর্শন (রেডিওগ্রুপ, টেক্সটভিউ, চেকবক্স ...) কভার করতে চান তবে আমি এটি করার একটি পদ্ধতি তৈরি করেছি:

protected void changeChildrenFont(ViewGroup v, Typeface font){
    for(int i = 0; i < v.getChildCount(); i++){

        // For the ViewGroup, we'll have to use recursivity
        if(v.getChildAt(i) instanceof ViewGroup){
            changeChildrenFont((ViewGroup) v.getChildAt(i), font);
        }
        else{
            try {
                Object[] nullArgs = null;
                //Test wether setTypeface and getTypeface methods exists
                Method methodTypeFace = v.getChildAt(i).getClass().getMethod("setTypeface", new Class[] {Typeface.class, Integer.TYPE});
                //With getTypefaca we'll get back the style (Bold, Italic...) set in XML
                Method methodGetTypeFace = v.getChildAt(i).getClass().getMethod("getTypeface", new Class[] {});
                Typeface typeFace = ((Typeface)methodGetTypeFace.invoke(v.getChildAt(i), nullArgs));
                //Invoke the method and apply the new font with the defined style to the view if the method exists (textview,...)
                methodTypeFace.invoke(v.getChildAt(i), new Object[] {font, typeFace == null ? 0 : typeFace.getStyle()});
            }
            //Will catch the view with no such methods (listview...)
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

এই পদ্ধতিটি এক্সএমএলে সেট করা ভিউয়ের স্টাইলটি ফিরে পাবে (গা set়, তির্যক ...) এবং সেগুলি উপস্থিত থাকলে তা প্রয়োগ করে apply

লিস্টভিউয়ের জন্য, আমি সর্বদা একটি অ্যাডাপ্টার তৈরি করি এবং আমি ফন্টটি ভিউ-এর ভিতরে সেট করি।


2

আমি বর্তমান দর্শনের শ্রেণিবিন্যাসের ভিউগুলিতে টাইপফেস নির্ধারণ করে টাইপফেস লিখেছি এবং ভিত্তিক ওএস বর্তমান টাইপফেস বৈশিষ্ট্যগুলি (সাহসী, সাধারণ, আপনি চাইলে অন্যান্য স্টাইল যুক্ত করতে পারেন):

public final class TypefaceAssigner {

public final Typeface DEFAULT;
public final Typeface DEFAULT_BOLD;

@Inject
public TypefaceAssigner(AssetManager assetManager) {
    DEFAULT = Typeface.createFromAsset(assetManager, "TradeGothicLTCom.ttf");
    DEFAULT_BOLD = Typeface.createFromAsset(assetManager, "TradeGothicLTCom-Bd2.ttf");
}

public void assignTypeface(View v) {
    if (v instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) v).getChildCount(); i++) {
            View view = ((ViewGroup) v).getChildAt(i);
            if (view instanceof ViewGroup) {
                setTypeface(view);
            } else {
                setTypeface(view);
            }
        }
    } else {
        setTypeface(v);
    }
}

private void setTypeface(View view) {
    if (view instanceof TextView) {
        TextView textView = (TextView) view;
        Typeface typeface = textView.getTypeface();
        if (typeface != null && typeface.isBold()) {
            textView.setTypeface(DEFAULT_BOLD);
        } else {
            textView.setTypeface(DEFAULT);
        }
    }
}
}

এখন অনভিউ তৈরি বা অনক্রিটভিউতে সমস্ত খণ্ডে, অনক্রিটে সমস্ত ক্রিয়াকলাপে এবং গেটভিউ বা নিউভিউতে সমস্ত ভিউ অ্যাডাপ্টারগুলিতে কেবল অনুরোধ করুন:

typefaceAssigner.assignTypeface(view);

2

এপিআই 26 এ বিল্ডড্র্যাডল .0.০.০ এবং উচ্চতর সহ আপনি পুনরায় আকারে একটি ফন্ট ডিরেক্টরি তৈরি করতে পারেন এবং আপনার স্টাইলে এই লাইনটি ব্যবহার করতে পারেন

<item name="android:fontFamily">@font/your_font</item>

build.gradle পরিবর্তনের জন্য আপনার build.gradle dependecies এ এটি ব্যবহার করুন

classpath 'com.android.tools.build:gradle:3.0.0'

এবং প্রকল্পে ফন্টটি কীভাবে সন্নিবেশ করবেন?
আজেফরাতি

@ আজারফতি আপনার ফন্টটি পুনরায় / ফন্টে অনুলিপি করুন
মোহাম্মদ

হ্যাঁ আমি ইতিমধ্যে এটি পেয়েছি। তবে এটি itemএকা পুরো অ্যাপটির জন্য ফন্ট সেট করে না। কোন সুত্র?
আজেরাফতি

1

অবশেষে, গুগল এই সমস্যার তীব্রতা বুঝতে পেরেছিল (ইউআই উপাদানগুলিতে কাস্টম ফন্ট প্রয়োগ করছে) এবং তারা এর জন্য একটি পরিষ্কার সমাধান প্রস্তুত করেছে।

প্রথমত, আপনাকে লাইব্রেরি 26+ সমর্থন করার জন্য আপডেট করতে হবে (আপনার গ্রেড {4.0+}, অ্যান্ড্রয়েড স্টুডিওও আপডেট করতে হবে), তারপরে আপনি ফন্ট নামে একটি নতুন সংস্থান ফোল্ডার তৈরি করতে পারেন। এই ফোল্ডারে আপনি নিজের ফন্টের সংস্থান (.tff, ...) রাখতে পারেন। তারপরে আপনাকে সেগুলি ডিফল্ট অ্যাপ্লিকেশনটিকে ওভাররাইড করতে হবে এবং এতে আপনার কাস্টম ফন্টটি বাধ্য করতে হবে :)

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">@font/my_custom_font</item>
</style>

দ্রষ্টব্য: আপনি যদি 16 বছরেরও বেশি বয়সী এপিআই সহ ডিভাইসগুলি সমর্থন করতে চান তবে আপনাকে অ্যান্ড্রয়েডের পরিবর্তে অ্যাপের নামস্থান ব্যবহার করতে হবে!


0

আমি API 21 Android 5.0 এর জন্য ওয়েস্টনের উত্তরও উন্নত করতে চাই improve

ডিফল্ট ফন্ট ব্যবহার করার সময় আমার স্যামসাং এস 5 এও আমার একই সমস্যা ছিল। (অন্যদের ফন্টের সাথে এটি কাজ করছে)

আমি প্রতিটি টেক্সটভিউ বা বোতামের জন্য এক্সএমএল ফাইলগুলিতে টাইপফেস (উদাহরণস্বরূপ "সানস") সেট করে এটি কাজ করেছিলাম

<TextView
android:layout_width="match_parent"
android:layout_height="39dp"
android:textColor="@color/abs__background_holo_light"
android:textSize="12sp"
android:gravity="bottom|center"
android:typeface="sans" />

এবং মাই অ্যাপ্লিকেশন ক্লাসে:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
    TypefaceUtil.overrideFont(getApplicationContext(), "SANS_SERIF",
    "fonts/my_font.ttf");
    }
}

আশা করি এটা সাহায্য করবে.



0

শিল্পস্বরুপহস্তলিপি বেশ ভালভাবে কাজ করে তবে এটি আমার পক্ষে উপযুক্ত নয়, কারণ এটি কোনও ফন্ট-পরিবারের জন্য বিভিন্ন ওজন (গা bold়, তির্যক ইত্যাদি) সমর্থন করে না।

তাই আমি ফন্টেইনের চেষ্টা করেছি , যা আপনাকে কাস্টম ভিউগুলি সংজ্ঞায়িত করতে এবং তাদের কাস্টম ফন্ট পরিবারগুলি প্রয়োগ করতে দেয়।

ফন্টেইন ব্যবহার করার জন্য আপনার অ্যাপ্লিকেশন মডিউলে বিল্ড.gradle এ নিম্নলিখিতটি যুক্ত করা উচিত:

compile 'com.scopely:fontain:1.0.0'

তারপরে নিয়মিত টেক্সটভিউ ব্যবহার না করে আপনার ফন্টটেক্সটভিউ ব্যবহার করা উচিত

বড় হাতের এবং বোল্ড কন্টেন্ট সহ ফন্টটেক্সটভিউয়ের উদাহরণ:

 <com.scopely.fontain.views.FontTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/black"
            android:textColor="@android:color/white"
            android:textSize="11dp"
            android:gravity="center"
            android:id="@+id/tv1"
            app:font_family="myCustomFont"
            app:caps_mode="characters"
            app:font_weight="BOLD"/>

0
package com.theeasylearn.demo.designdemo;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class MyButton extends TextView {

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

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

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

    private void init() {

            Typeface tf =
                    Typeface.createFromAsset(
                            getContext().getAssets(), "angelina.TTF");
            setTypeface(tf);

    }

}

একটি নিখুঁত সমাধান নয়। এই সলিউশন ব্যবহার অ্যাক্সেস ডিফল্ট অ্যানড্রইড কাস্টম সমাধান নীচে উপস্থিত প্রয়োজন হবে TextViewগুলি
blueware

0

টেক্সটভিউজের ডিফল্ট ফন্ট পরিবার পরিবর্তনের জন্য আপনার অ্যাপ্লিকেশন থিমটিতে পাঠ্য ভিউ স্টাইলকে ওভাররাইড করুন।

ফন্টফ্যামিলিতে কাস্টম ফন্ট ব্যবহার করার জন্য, সমর্থন লাইব্রেরিতে থাকা ফন্ট সংস্থানগুলি ব্যবহার করুন।

বৈশিষ্ট্যটি অ্যান্ড্রয়েড 26 এ যুক্ত করা হয়েছিল তবে সাপোর্টলিবের মাধ্যমে পুরানো সংস্করণগুলিতে ব্যাকপোর্ট করা হয়েছে।

https://developer.android.com/guide/topics/resources/font-resource.html https://developer.android.com/guide/topics/ui/look-and-feel/fouts-in-xml.html # ব্যবহার-সমর্থন-liberal এর সংক্ষিপ্ত রূপ


0

অ্যান্ড্রয়েড ওরিও এবং এর সমর্থন লাইব্রেরি প্রকাশের পরে (26.0.0) আপনি এটি সহজেই করতে পারেন। পড়ুন এই উত্তর আরেকটি প্রশ্ন আছে।

মূলত আপনার চূড়ান্ত শৈলীটি দেখতে এইরকম হবে:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
   <item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 -->
</style>


-15

হ্যাঁ, সম্পূর্ণ অ্যাপ্লিকেশনে ফন্ট সেট করা সম্ভব।

এটি সম্পাদন করার সহজতম উপায় হ'ল আপনার অ্যাপ্লিকেশনটির সাথে পছন্দসই ফন্টগুলি প্যাকেজ করা।

এটি করার জন্য, প্রকল্পের মূলের মধ্যে কেবল একটি সম্পদ / ফোল্ডার তৈরি করুন এবং সম্পদগুলিতে আপনার ফন্টগুলি (ট্রু টাইপ, বা টিটিএফ, ফর্মে) রাখুন।

আপনি উদাহরণস্বরূপ, সম্পত্তি / ফন্ট / তৈরি করতে এবং আপনার টিটিএফ ফাইলগুলিকে সেখানে রেখে দিতে পারেন।

public class FontSampler extends Activity {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
TextView tv=(TextView)findViewById(R.id.custom);

Typeface face=Typeface.createFromAsset(getAssets(), "fonts/HandmadeTypewriter.ttf");
tv.setTypeface(face);
}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.