কাস্টম ফন্ট এবং এক্সএমএল লেআউট (অ্যান্ড্রয়েড)


174

আমি অ্যান্ড্রয়েডে এক্সএমএল ফাইলগুলি ব্যবহার করে একটি জিইউআই লেআউটকে সংজ্ঞায়িত করার চেষ্টা করছি। আমি যতদূর জানতে পারি, আপনার উইজেটগুলিতে এক্সএমএল ফাইলগুলিতে একটি কাস্টম ফন্ট (যেমন আপনি সম্পদ / ফন্ট / স্থাপন করেছেন) ব্যবহার করা উচিত তা নির্দিষ্ট করার কোনও উপায় নেই এবং আপনি কেবল সিস্টেম ইনস্টলড ফন্ট ব্যবহার করতে পারেন।

আমি জানি যে, জাভা কোডে আমি প্রতিটি উইজেটের ফন্টটি ম্যানুয়ালি অনন্য আইডি ব্যবহার করে পরিবর্তন করতে পারি। বিকল্পভাবে, আমি এই পরিবর্তনটি করতে জাভার সমস্ত উইজেটগুলিতে পুনরাবৃত্তি করতে পারি, তবে এটি সম্ভবত খুব ধীর হবে।

আমার আর কোন বিকল্প নেই? পছন্দসই চেহারা রয়েছে এমন উইজেটগুলি তৈরি করার আরও ভাল কোনও উপায় আছে কি? আমি যুক্ত প্রতিটি নতুন উইজেটের জন্য ম্যানুয়ালি ফন্টটি পরিবর্তন করতে চাই না।


68
DrDefrost - দয়া করে কিছু উত্তর গ্রহণ করুন, আপনি এই সাইটে আরও প্রতিক্রিয়া পাবেন।
এসকে 9

1
এখানে আরও একটি অনুরূপ প্রশ্ন এখানে রয়েছে: স্ট্যাকওভারফ্লো.com
ভিন

05/2017 আপডেট হয়েছে: "সাপোর্ট লাইব্রেরি 26.0 বিটা অ্যান্ড্রয়েড এপিআই সংস্করণ 14 এবং এর বেশি চলমান ডিভাইসগুলিতে এক্সএমএল বৈশিষ্ট্যটিতে ফন্টগুলিতে সহায়তা সরবরাহ করে" " দেখুন: ডেভেলপার.আ্যান্ড্রয়েড.
com/preview/features/…

উত্তর:


220

আমি এখানে যেমন শিখেছি তেমন কাস্টম ফন্ট সেট করতে আপনি টেক্সটভিউ প্রসারিত করতে পারেন ।

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xML: ( পুনরায় / মানসমূহে)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewPlus">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

আপনি সম্পদ ফোল্ডারে "saxmono.ttf" রাখবেন ।

আপডেট 8/1/13

এই পদ্ধতিটি নিয়ে গুরুতর স্মৃতির উদ্বেগ রয়েছে। দেখুন chedabob এর মন্তব্য থেকে কম।


5
এটি দেখতে দুর্দান্ত লাগছে, আমি যখন মূল.এক্সএমএলতে "টেক্সটভিউপ্লাস" ব্যবহার করার চেষ্টা করি তখন আমি একটি ত্রুটি পাচ্ছি। আমি নিম্নলিখিতগুলি পেয়েছি: - ত্রুটি: এক্সএমএলকে পার্স করার সময় ত্রুটি: আনবাউন্ড উপসর্গ - "foo: কাস্টমফন্ট" এলিমেন্ট টাইপ "সাপোর্টলিবস।
মাজজুদি

79
একটি বিষয় লক্ষণীয় যে এটি কয়েক ডজন এবং কয়েক ডজন টাইপফিস অবজেক্ট তৈরি করবে এবং মেমরি খেয়ে ফেলবে। প্রি -৪.০ অ্যান্ড্রয়েডে একটি বাগ রয়েছে যা টাইপফিসগুলি সঠিকভাবে মুক্ত করে না। করণীয় সবচেয়ে সহজ কাজ হ্যাশম্যাপের সাথে টাইপফ্রেস ক্যাশে তৈরি করা। এটি আমার অ্যাপ্লিকেশনটিতে মেমরির ব্যবহার 120+ এমবি থেকে 18 এমবি নামিয়ে নিয়েছে। কোড.google.com/p/android/issues/detail?id=9904
শেডবব

7
@ মাজজুদি: আপনি যদি নিজের লেআউটে ২ য় নেমস্পেস যুক্ত করতে ভুলে যান তবে সাধারণত এটি ঘটে:xmlns:foo="http://schemas.android.com/apk/res/com.example
থিও

11
খুব গুরুত্বপূর্ণ - আমি চেডাবোবের পরামর্শকে দ্বিগুণ করতে চাই। আপনি যদি এটি অনুসরণ না করেন তবে প্রাক আইসিএসে আপনার একটি মেমরি ফাঁস হবে। কয়েক সমাধান আছে, তাদের মধ্যে একজন chedabob দ্বারা পাঠানো লিঙ্কে হয়, অন্য এক এখানে: stackoverflow.com/questions/8057010/listview-memory-leak । পিটার - দয়া করে আপনার উত্তর আপডেট করুন - এটি দুর্দান্ত তবে সম্পূর্ণ নয়
Michał K

1
প্রস্থ এবং উচ্চতার মতো অন্যান্য পাঠ্যদর্শন বৈশিষ্ট্যগুলি ছাড়াও আমি এই পছন্দসই বৈশিষ্ট্যটি কীভাবে স্টাইল.এক্সএমএলে সেট করব?
loeschg

35

আমি পার্টির জন্য 3 বছর দেরি করছি :( তবে এই পোস্টের উপর হোঁচট খাতে পারে এমন কারও পক্ষে এটি কার্যকর হতে পারে।

আমি একটি লাইব্রেরি লিখেছি যা টাইপফেসগুলি ক্যাশে করে এবং আপনাকে এক্সএমএল থেকে কাস্টম টাইপফেসগুলি নির্দিষ্ট করার অনুমতি দেয়। আপনি এখানে লাইব্রেরি খুঁজে পেতে পারেন ।

আপনি যখন এটি ব্যবহার করবেন তখন আপনার এক্সএমএল লেআউটটি দেখতে কেমন হবে তা এখানে।

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />

আরে @ রাগুনাথ-জওহর, গ্রেডেল প্রকল্পের জন্য আমি কীভাবে গ্রন্থাগারটি আমদানি করব? আমি চেষ্টা করেছি compile 'com.mobsandgeeks:android-typeface-textview:1.0'কিন্তু কাজ হয়নি।
আইমাঙ্গো

1
এটি সেভাবে ব্যবহার করতে সক্ষম হওয়ার জন্য আপনার কাছে AAR দরকার হবে need এটি এখনও নেই। আপনি উত্সগুলি অনুলিপি করতে পারেন এবং আপাতত একটি Android স্টুডিও লাইব্রেরি প্রকল্প তৈরি করতে পারেন।
রাগুনাথ জওহর

2
আপনার গাইকুই ট্যাগ কোথা থেকে এসেছে?
সেফিরসু

3
অভিভাবক ট্যাগে উল্লিখিত নাম স্থান থেকে -xmlns:geekui="http://schemas.android.com/apk/res-auto"
রাগুনাথ জওহর

1
@ মুহম্মেদ রেফাত, হ্যাঁ এটি :)
রাগুনাথ জওহর

18

এটি কিছুটা দেরিতে হতে পারে তবে আপনার একটি সিঙ্গলটন ক্লাস তৈরি করতে হবে যা মেমরি ফাঁস এড়াতে কাস্টম টাইপফেসটি ফেরত দেয়।

টাইপফ্রেস শ্রেণি:

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

কাস্টম টেক্সটভিউ:

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

এক্সএমএল দ্বারা:

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

প্রোগ্রামেটিক্যালি:

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());

রানটাইমের সময় কাজ করা দেখে মনে হচ্ছে, তবে এটি কি ডিজাইনারের পাশাপাশি কাজ করার কথা রয়েছে?
ম্যাগনাস জোহানসন

অবশ্যই। আপনি এক্সএমএল হিসাবে ব্যবহার করতে পারেন। @ ম্যাগনাস
লিওনার্দো কার্ডোসো

আমি মনে করি আপনি ভুল বুঝেছেন, এটি ডিজাইনের সময় (ডিজাইনার পূর্বরূপ) এ কাজ করবে বলে মনে হয় না । (এক্সএমএল! = ডিজাইনার) এটি রানটাইমগুলিতে সংকলিত এক্সএমএল লেআউট ফাইলটিতে সুনির্দিষ্টভাবে কাজ করে। যাইহোক, আমি এই এক্সটেনশনটি github.com/danh32/Fontify ব্যবহার করছি , যা আমার প্রয়োজনের জন্য আরও ভাল কাজ করে (এটি একাধিক ফন্ট শৈলী, নিয়মিত, সাহসী ইত্যাদি পাশাপাশি বিভিন্ন ফন্টের নাম পাশাপাশি টেক্সটভিউয়ের বাইরে অন্যান্য নিয়ন্ত্রণকে সমর্থন করে)
ম্যাগনাস জোহানসন

2
গেটটাইপফিজ প্রতিটি কলে একটি নতুন টাইপফেস তৈরি করে ... এটি সিঙ্গলটনের উদ্দেশ্যকে পরাস্ত করে। এটিতে একটি স্থিতিশীল ক্ষেত্র থাকা উচিত যা কল করার সময় প্রথমবার সেট করা হয় এবং পরবর্তী কলগুলিতে এই ক্ষেত্রটির মান প্রদান করে।
স্টিভেন পেনা

1
@চিওয়াই ঠিক বলেছেন! প্রথম প্রশ্ন সম্পর্কে এটির দরকার নেই। দ্বিতীয়টি সম্পর্কে এটি টাইপো ছিল।
লিওনার্দো কার্ডোসো

13

পুরানো প্রশ্ন, তবে আমি নিশ্চিত একটি ভাল সমাধানের জন্য নিজের অনুসন্ধান শুরু করার আগে আমি এই উত্তরটি এখানে পড়তে চাই। ক্যালিগ্রাফিandroid:fontFamily আপনার সম্পদ ফোল্ডারে কাস্টম ফন্টগুলির জন্য সমর্থন যুক্ত করতে বৈশিষ্ট্যটি প্রসারিত করে :

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

এটি সক্রিয় করতে আপনাকে কেবলমাত্র যা করতে হবে তা হ'ল এটি আপনি ব্যবহার করছেন এমন কার্যকলাপের প্রসঙ্গে যুক্ত করুন:

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

আপনি প্রতিস্থাপন করতে নিজের নিজস্ব কাস্টম বৈশিষ্ট্য নির্দিষ্ট করতে পারেন android:fontFamily

এটি অ্যাপ থিম সহ থিমগুলিতেও কাজ করে।


8

ডেটাবাইন্ডিং ব্যবহার :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

এক্সএমএলে:

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

হরফ ফাইল অবশ্যই থাকা উচিত assets/fonts/


7

আপনার যদি কেবল একটি টাইপফেস থাকে তবে আপনি যুক্ত করতে চান এবং কম কোড লিখতে চান তবে আপনি আপনার নির্দিষ্ট ফন্টের জন্য একটি ডেডিকেটেড টেক্সটভিউ তৈরি করতে পারেন। নীচে কোড দেখুন।

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

মেইন.এক্সএমএল এ আপনি এখন আপনার পাঠ্য ভিউটি যুক্ত করতে পারেন:

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

এটি init এ করুন () এবং নিজেকে একই কলটিতে 3x সংরক্ষণ করুন।
এরিকসগ

@ এরিকোসগ আমি এই ত্রুটিটি পেয়েছি যখন আমি আপনার এই সমাধানটি android.view.InflateException ব্যবহার করি: বাইনারি এক্সএমএল ফাইল লাইন # 9: বর্গ বর্ধমান com.ascent.adwad.utils.CustomTextView
সাগর

@ সাগরদেভঙ্গা, আরও তথ্য ছাড়া সহায়তা করা কঠিন। আপনি যতদূর পারেন এটিকে নিয়ে যান এবং একটি নতুন প্রশ্ন করুন।
এরিকসগ

7

অ্যান্ড্রয়েড ওের পূর্বরূপ রিলিজ থেকে এটি করার সর্বোত্তম উপায়টি হল এই উপায়টি
1.) রেজোল্ট ফোল্ডারে ডান ক্লিক করুন এবং নতুন> অ্যান্ড্রয়েড রিসোর্স ডিরেক্টরিতে যান । নতুন
রিসোর্স ডিরেক্টরি উইন্ডো প্রদর্শিত হবে।
২) রিসোর্স ধরণের তালিকায় ফন্ট নির্বাচন করুন এবং তারপরে ওকে ক্লিক করুন।
৩) ফন্ট ফোল্ডারে আপনার ফন্ট ফাইলগুলি যুক্ত করুন folder
৪) সম্পাদনায় ফাইলের ফন্টগুলি পূর্বরূপ দেখতে একটি ফন্ট ফাইল ডাবল ক্লিক করুন

পরবর্তী আমাদের অবশ্যই একটি ফন্ট পরিবার তৈরি করতে হবে

১) ফন্ট ফোল্ডারে ডান ক্লিক করুন এবং নতুন> ফন্ট রিসোর্স ফাইলে যান । নতুন রিসোর্স ফাইল উইন্ডো প্রদর্শিত হবে।
২) ফাইলের নাম দিন এবং তারপরে ওকে ক্লিক করুন । নতুন ফন্টের রিসোর্স এক্সএমএল সম্পাদকটিতে খোলে।
৩) ফন্ট ট্যাগ উপাদানগুলিতে প্রতিটি ফন্ট ফাইল, স্টাইল এবং ওজন বৈশিষ্ট্য সংযুক্ত করুন। নিম্নলিখিত এক্সএমএল হ'ল ফন্ট রিসোর্স এক্সএমএলে ফন্ট সম্পর্কিত বৈশিষ্ট্য যুক্ত করার চিত্র তুলে ধরেছে:

<?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/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

টেক্সটভিউতে ফন্ট যুক্ত করা হচ্ছে:

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

যেমন ডকুমেন্টেশন থেকে

হরফ দিয়ে কাজ করা

সমস্ত পদক্ষেপ সঠিক।


1
সেরা উত্তর! হরফ ফাইলের নামটি অবশ্যই ছোট হাতের অক্ষরে থাকতে হবে।
দিমিত্রি

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

5

TextViewএটিকে প্রসারিত করুন এবং একটি কাস্টম বৈশিষ্ট্য দিন বা আপনি কী ফন্ট ব্যবহার করতে চান তার একটি স্ট্রিংয়ে পাস করতে অ্যান্ড্রয়েড: ট্যাগ বৈশিষ্ট্যটি ব্যবহার করুন। আপনার একটি কনভেনশন বাছাই করতে হবে এবং এটির সাথে লেগে থাকতে হবে যেমন আমি আমার সমস্ত ফন্টগুলি রিসেস / সম্পদ / ফন্ট / ফোল্ডারে রাখব যাতে আপনার পাঠ্য ভিউ ক্লাসটি জানতে পারে কোথায় সেগুলি খুঁজে পাবে। তারপরে আপনার কনস্ট্রাক্টরে আপনি কেবল সুপার কলের পরে ফন্টটি ম্যানুয়ালি সেট করলেন।


4

কাস্টম ফন্টগুলি ব্যবহারের একমাত্র উপায় হ'ল সোর্স কোড।

কেবল মনে রাখবেন যে অ্যান্ড্রয়েড খুব সীমাবদ্ধ সংস্থান এবং ফন্টগুলির সাথে ডিভাইসগুলিতে চলে a বিল্ট-ইন ড্রড ফন্টগুলি বিশেষভাবে তৈরি করা হয় এবং আপনি যদি খেয়াল করেন তবে অনেকগুলি অক্ষর এবং সজ্জা অনুপস্থিত রয়েছে।


"কেবল মনে রাখবেন যে অ্যান্ড্রয়েড খুব সীমাবদ্ধ সংস্থান সহ ডিভাইসগুলিতে চালিত হয়" -> এটি কম-বেশি হয়ে উঠছে। কোয়াড কোর ফোন? সত্যিই ??
Sandy

9
আমি তারেকএইচএস এর উত্তরের প্রসঙ্গটি বিবেচনার জন্য আরও কিছু করব, যা আপনার মন্তব্যের আগে আড়াই বছর পূর্বে পূর্বাভাস দেয়।
এসকে 9

আপনার প্রতিক্রিয়াটির প্রথম অংশটি সত্য হতে পারে আপনি যখন নিজের উত্তরটি 2010 সালে লিখেছিলেন The তবে পরেরটি সুপারফ্লুয়াস এবং এর পাশাপাশি রয়েছে: ড্রয়েড খারাপ ছিল, গুগলের দ্বারা 2012 সালে রোবোটোর পক্ষে ছিল d অ্যান্ড্রয়েডে টাইপোগ্রাফির পছন্দের অভাব একটি ত্রুটি, কোনও বৈশিষ্ট্য নয়; ২০০ today's সাল থেকে আইওএসের বিকাশকারীদের কাছে আজকের মান অনুসারে আদিম ডিভাইসের অধীনে একাধিক ফন্ট রয়েছে available
মহাজাগতিক

এই উত্তর আর বৈধ নয়।
মার্টিন কনেকনি

2

টেক্সটভিউকে প্রসারিত না করে এবং একটি দীর্ঘ কোড প্রয়োগ না করেই আমার প্রশ্নের সহজ উত্তর হতে পারে।

কোড:

 TextView tv = (TextView) findViewById(R.id.textview1);
    tv.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

যথারীতি সম্পদ ফোল্ডারে কাস্টম ফন্ট ফাইলটি রাখুন এবং এটি ব্যবহার করে দেখুন। এটা আমার জন্য কাজ করে. আমি কেবল বুঝতে পারি না কেন পিটার এই সাধারণ জিনিসের জন্য এত বিশাল কোড দিয়েছেন বা তিনি তার উত্তরটি পুরানো সংস্করণে দিয়েছেন।


2

এছাড়াও কাস্টম ক্লাস তৈরি না করে এক্সএমএলে সংজ্ঞায়িত করা যায়

style.xml

<style name="ionicons" parent="android:TextAppearance">
    <!-- Custom Attr-->
    <item name="fontPath">fonts/ionicons.ttf</item>
</style>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/ionicons"
        android:text=""/>
</LinearLayout>

একটি দ্রুত নোট, কারণ আমি সবসময় ভুলে গেছি ফন্টগুলি কোথায় রাখা উচিত, এটি হ'ল ফন্টটি অবশ্যই ভিতরে থাকবে assetsএবং এই ফোল্ডারটি একই স্তরে থাকবে resএবং srcআমার ক্ষেত্রে এটির ক্ষেত্রেassets/fonts/ionicons.ttf

আপডেট করা রুট বিন্যাস আপডেট হয়েছে কারণ এই পদ্ধতিটির xmlns:app="http://schemas.android.com/apk/res-auto"কাজ করা দরকার

আপডেট 2 এমন একটি লাইব্রেরি সম্পর্কে ভুলে গিয়েছি যা আমি কলিগ্রাফি নামে আগে ইনস্টল করেছি


এটি আমার পক্ষে কাজ করে না। আমি এটি তৈরি করার চেষ্টা করার সময় আমি ত্রুটি বার্তাটি পাই: ত্রুটি: (49, 5) প্রদত্ত নামের সাথে মিলছে এমন কোনও সংস্থান খুঁজে পাওয়া যায় নি: অ্যাটর 'ফন্টপথ'।
স্টিফ

xmlns:app="http://schemas.android.com/apk/res-auto"আপনার মূল বিন্যাসে যুক্ত করার চেষ্টা করুন , আপডেট করা
উত্তরটিও

ত্রুটিটি XML ফাইলের বিন্যাস থেকে আসে না তবে শৈলীর XML ফাইল থেকে আসে। মনে হচ্ছে এটি কোনও ফন্টপথ কী তা 'জানে না'।
স্টিফ

আপনার অধিকার, ভুলে গেছেন যে আমি ক্যালিগ্রিপি নামে একটি লাইব্রেরি করেছি
norman784

1

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

আমার কোড এখানে


1

ফন্টগুলি কাস্টমাইজ করার দুটি উপায় রয়েছে:

!!! সম্পদ / ফন্ট / iran_sans.ttf এ আমার কাস্টম ফন্ট

ওয়ে 1: রিফ্রাকশন টাইপফেস.ক্লাস || কেপ সবচেয়ে ভালো উপায়

ক্লাসে ফন্টস ওভাররাইড.সেট ডেফল্টফন্ট () কল করুন অ্যাপ্লিকেশন প্রসারিত করুন, এই কোডটি সমস্ত সফ্টওয়্যার ফন্ট, এমনকি টোস্ট ফন্টগুলি পরিবর্তিত করবে

AppController.java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.java

public class FontsOverride {

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

    private 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();
        }
    }
}

ওয়ে 2: সেটটাইপফেস ব্যবহার করুন

বিশেষ দেখার জন্য হরফ পরিবর্তন করতে সেটআপ টাইপফেস () কল করুন।

CTextView.java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}

0

এখানে একটি টিউটোরিয়াল যা আপনাকে দেখায় যে কীভাবে @ পেটার বর্ণিত কাস্টম ফন্ট সেটআপ করবেন: http://responsiveandroid.com/2012/03/15/custom-fouts-in-android-widgets.html

এটিতে সম্ভাব্য মেমরি ফাঁস আলা http://code.google.com/p/android/issues/detail?id=9904 এর জন্যও বিবেচনা রয়েছে । টিউটোরিয়ালে একটি বোতামে কাস্টম ফন্ট সেট করার উদাহরণ রয়েছে is


0

আপনি সহজেই কাস্টম পাঠ্যদর্শন শ্রেণি তৈরি করতে পারেন: -

সুতরাং আপনার প্রথমে যা করা দরকার, Custom textviewবর্গ তৈরি করুন যা দিয়ে প্রসারিত হয়েছে AppCompatTextView

public class CustomTextView extends AppCompatTextView {
    private int mFont = FontUtils.FONTS_NORMAL;
    boolean fontApplied;

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

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

    public CustomTextView(Context context) {
        super(context);
        init(null, context);
    }

    protected void init(AttributeSet attrs, Context cxt) {
        if (!fontApplied) {
            if (attrs != null) {
                mFont = attrs.getAttributeIntValue(
                        "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                        -1);
            }
            Typeface typeface = getTypeface();
            int typefaceStyle = Typeface.NORMAL;
            if (typeface != null) {
                typefaceStyle = typeface.getStyle();
            }
            if (mFont > FontUtils.FONTS) {
                typefaceStyle = mFont;
            }
            FontUtils.applyFont(this, typefaceStyle);
            fontApplied = true;
        }
    }
}

এখন প্রতিবার কাস্টম টেক্সট ভিউ কল হবে এবং আমরা গুণাবলীর কাছ থেকে মান পাব int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1)

অথবা

আমরা আমাদের এক্সএমএল ( android:textStyle="bold|normal|italic") এ সেট করেছিলাম এমন দৃশ্য থেকে আমরা গেটটাইপফেস () পেতে পারি । আপনি যা করতে চান তাই করুন।

এখন, আমরা FontUtilsআমাদের ভিউতে কোনও .ttf ফন্ট সেট করার জন্য তৈরি করি ।

public class FontUtils {

    public static final int FONTS = 1;
    public static final int FONTS_NORMAL = 2;
    public static final int FONTS_BOLD = 3;
    public static final int FONTS_BOLD1 = 4;

    private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();

    static Typeface getFonts(Context context, String name) {
        Typeface typeface = TYPEFACE.get(name);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(context.getAssets(), name);
            TYPEFACE.put(name, typeface);
        }
        return typeface;
    }

    public static void applyFont(TextView tv, int typefaceStyle) {

        Context cxt = tv.getContext();
        Typeface typeface;

        if(typefaceStyle == Typeface.BOLD_ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
        } else if (typefaceStyle == Typeface.ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
        } else {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }
        if (typeface != null) {
            tv.setTypeface(typeface);
        }
    }
}

0

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

আপনি নিম্নলিখিত পদ্ধতিতে পুরো অ্যাপ্লিকেশনটিতে একটি কাস্টম ফন্ট প্রয়োগ করতে পারেন।

  1. ফোল্ডারে ফন্টটি রাখুন res/font

  2. ইন res/values/styles.xmlএটা ব্যবহার আবেদন থিমে। <style name="AppTheme" parent="{whatever you like}"> <item name="android:fontFamily">@font/myfont</item> </style>



-5

আপনি উইজেট তৈরি করতে বা উইজেট বিন্যাসে একটি ব্যবহার করতে টেক্সটভিউ প্রসারিত করতে পারবেন না: http://developer.android.com/guide/topics/appwidgets/index.html


1
আহা - "উইজেট" শব্দের বিখ্যাত দ্বিগুণ ব্যবহার আবারও আঘাত হানে!
কার্ল হোহেলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.