ActionBar शीर्षक में कस्टम फ़ॉन्ट कैसे सेट करें?


257

कैसे (यदि संभव हो) मैं अपने एसेट फ़ोल्डर में एक फॉन्ट के साथ एक्शनबेर शीर्षक टेक्स्ट (केवल - टैब टेक्स्ट नहीं) में एक कस्टम फ़ॉन्ट सेट कर सकता हूं? मैं Android: लोगो विकल्प का उपयोग नहीं करना चाहता।

जवाबों:


211

मैं मानता हूं कि यह पूरी तरह से समर्थित नहीं है, लेकिन यहां मैंने जो किया है। आप अपने ऐक्शन बार के लिए कस्टम दृश्य का उपयोग कर सकते हैं (यह आपके आइकन और आपके एक्शन आइटम के बीच प्रदर्शित होगा)। मैं एक कस्टम दृश्य का उपयोग कर रहा हूं और मेरे पास मूल शीर्षक अक्षम है। मेरी सभी गतिविधियाँ एक एकल गतिविधि से विरासत में मिली हैं, जिसमें यह कोड onCreate में है:

this.getActionBar().setDisplayShowCustomEnabled(true);
this.getActionBar().setDisplayShowTitleEnabled(false);

LayoutInflater inflator = LayoutInflater.from(this);
View v = inflator.inflate(R.layout.titleview, null);

//if you need to customize anything else about the text, do it here.
//I'm using a custom TextView with a custom font in my layout xml so all I need to do is set title
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());

//assign the view to the actionbar
this.getActionBar().setCustomView(v);

और मेरा लेआउट xml (उपरोक्त कोड में R.layout.titleview) इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

<com.your.package.CustomTextView
        android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:textSize="20dp"
            android:maxLines="1"
            android:ellipsize="end"
            android:text="" />
</RelativeLayout>

1
यह शीर्षक के लिए ठीक काम करता है, लेकिन यदि आप एक शीर्षक और टैब चाहते हैं तो यह कस्टम दृश्य को टैब के दाईं ओर छोड़ देता है जैसे शीर्षक नहीं होगा। मैं वास्तविक शीर्षक को बदलने में सक्षम होना पसंद करूंगा।
दैनिक

2
महान समाधान। यदि आपको एक कस्टम टेक्स्ट व्यू क्लास की आवश्यकता है जो XML में फ़ॉन्ट के विनिर्देशन की अनुमति देता है, तो कृपया मेरा प्रयास करें! github.com/tom-dignan/nifty - यह बहुत आसान है।
थॉमस डिगन

क्या यह कोड onCreate () में होना चाहिए? मुझे इसे अपनी गतिविधि के बाहर गतिशील रूप से सेट करने की आवश्यकता है ...
इगोरगानपोलस्की

आपको फ़ॉन्ट को गतिशील रूप से बदलने की आवश्यकता है? या क्या आप फ़ॉन्ट को पहले से अनुकूलित करने के बाद सिर्फ शीर्षक बदलना चाहते हैं?
सैम डोजर

2
यह काम करता है, लेकिन यह बहुत काम का तरीका है। प्लस: आप मानक शीर्षक की कुछ विशेषताओं को खो देते हैं, जैसे कि आइकन पर क्लिक करने पर इसे हाइलाइट किया गया ... कस्टम शीर्षक का उपयोग केवल फोंट को बदलने के लिए मानक शीर्षक लेआउट को फिर से बनाने के लिए नहीं किया जाता है ...
Zordid

422

आप एक कस्टम TypefaceSpanवर्ग का उपयोग करके ऐसा कर सकते हैं । यह customViewऊपर बताए गए दृष्टिकोण से बेहतर है क्योंकि यह अन्य एक्शन बार तत्वों जैसे एक्शन दृश्यों का विस्तार करते समय टूटता नहीं है।

ऐसी कक्षा का उपयोग कुछ इस तरह दिखेगा:

SpannableString s = new SpannableString("My Title");
s.setSpan(new TypefaceSpan(this, "MyTypeface.otf"), 0, s.length(),
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getActionBar();
actionBar.setTitle(s);

कस्टम TypefaceSpanवर्ग आपकी गतिविधि संदर्भ और आपकी assets/fontsनिर्देशिका में एक टाइपफेस का नाम है । यह फ़ाइल को लोड करता है और मेमोरी में एक नया Typefaceउदाहरण देता है। का पूरा कार्यान्वयन TypefaceSpanआश्चर्यजनक रूप से सरल है:

/**
 * Style a {@link Spannable} with a custom {@link Typeface}.
 * 
 * @author Tristan Waddington
 */
public class TypefaceSpan extends MetricAffectingSpan {
      /** An <code>LruCache</code> for previously loaded typefaces. */
    private static LruCache<String, Typeface> sTypefaceCache =
            new LruCache<String, Typeface>(12);

    private Typeface mTypeface;

    /**
     * Load the {@link Typeface} and apply to a {@link Spannable}.
     */
    public TypefaceSpan(Context context, String typefaceName) {
        mTypeface = sTypefaceCache.get(typefaceName);

        if (mTypeface == null) {
            mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                    .getAssets(), String.format("fonts/%s", typefaceName));

            // Cache the loaded Typeface
            sTypefaceCache.put(typefaceName, mTypeface);
        }
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

बस उपरोक्त वर्ग को अपनी परियोजना में कॉपी करें और इसे अपनी गतिविधि की onCreateविधि में लागू करें जैसा कि ऊपर दिखाया गया है।


20
अच्छा उत्तर। यह देखने के लिए अच्छा है कि आपने टाइपफेस तत्व को कैश करने का एक तरीका भी दिखाया है।
आनंद साईंनाथ

6
यह उत्कृष्ट है। एक गेटा - यदि textAllCapsविशेषता अंतर्निहित TextView (जैसे एक विषय के माध्यम से) पर सही पर सेट है, तो कस्टम फ़ॉन्ट दिखाई नहीं देगा। मेरे लिए यह एक समस्या थी जब मैंने इस तकनीक को एक्शन बार टैब आइटम पर लागू किया।
जेम्स

4
ध्यान दें कि वर्ग का यह कार्यान्वयन मानता है कि आपने अपनी फ़ॉन्ट फ़ाइलें अंदर रखी हैं assets/fonts/। यदि आप केवल .ttf / .otf फ़ाइलों को संपत्तियों के अंतर्गत और एक सबफ़ोल्डर में नहीं फेंकते हैं, तो आपको कोड की निम्न पंक्ति को तदनुसार संशोधित करना चाहिए String.format("fonts/%s", typefaceName):। मैंने इसे भांपने की कोशिश में अच्छे 10 मिनट गंवा दिए। यदि आप नहीं करते हैं, तो आपको मिलेगाjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt

1
ऐप शुरू करने के क्षण में, डिफ़ॉल्ट शीर्षक शैली दिखाई देती है और लगभग 1 सेकंड बाद में कस्टम शैली दिखाई देती है। बुरा यूआई ...
वोट दें

2
यह एक शानदार जवाब है और इससे मुझे एक टन निकालने में मदद मिली। एक सुधार जो मैं जोड़ना चाहूंगा वह है कैशिंग तंत्र को टाइपफेसस्पैन के बाहर अपनी कक्षा में ले जाना। मैं अन्य स्थितियों में भाग गया, जहां मैं एक स्पान के बिना टाइपफेस का उपयोग कर रहा था और इससे मुझे उन स्थितियों में भी कैश का लाभ उठाने की अनुमति मिली।
जस्टिन

150
int titleId = getResources().getIdentifier("action_bar_title", "id",
            "android");
    TextView yourTextView = (TextView) findViewById(titleId);
    yourTextView.setTextColor(getResources().getColor(R.color.black));
    yourTextView.setTypeface(face);

2
यह प्रश्न का पसंदीदा उत्तर होना चाहिए। महान, "एक्शन_बार_सुबीतल" के साथ भी काम करता है! धन्यवाद!
जोर्डिड

20
यदि एक नए संस्करण में एंड्रॉइड डेवलपर्स "एक्शन_बार_टिटेल" से संसाधन आईडी को अन्य नाम में बदलते हैं, तो इसमें से कुछ भी काम नहीं करेगा। इसलिए यह मतदान नहीं है।
बेंटो

6
Api> 3.0 पर काम करता है, लेकिन appxpat के लिए 2.x में नहीं
अमन सिंघल

1
यह फ़ॉन्ट और सब कुछ बदल देता है। लेकिन जब मुझे अगली गतिविधि मिल जाती है और फ़ॉन्ट वापस हो जाता है। मुझे लगता है कि यह ActionBar गुणों के साथ कुछ करना है।
प्रणव महाजन

11
@ डिट्ज़: यह "होलो थीम" के लिए बहुत अच्छा काम करता है, लेकिन "मटेरियल थीम" (एंड्रॉइड एल) के लिए नहीं है। TitleId पाया जाता है, लेकिन टेक्स्टव्यू अशक्त है। किसी भी विचार को इसे कैसे ठीक करना है? धन्यवाद!
माइकल डी।

34

से Android समर्थन लाइब्रेरी v26 + एंड्रॉयड स्टूडियो 3.0 के बाद, इस प्रक्रिया को आसान एक झटका के रूप में बन गया है !!

टूलबार शीर्षक के फ़ॉन्ट को बदलने के लिए इन चरणों का पालन करें:

  1. डाउनलोड करने योग्य फ़ॉन्ट्स पढ़ें और सूची ( मेरी अनुशंसा ) से किसी भी फ़ॉन्ट का चयन करें या XML में फ़ॉन्ट के res > fontअनुसार एक कस्टम फ़ॉन्ट लोड करें
  2. में res > values > styles, निम्नलिखित पेस्ट करें ( अपनी कल्पना का उपयोग यहां करें! )

    <style name="TitleBarTextAppearance" parent="android:TextAppearance">
        <item name="android:fontFamily">@font/your_desired_font</item>
        <item name="android:textSize">23sp</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@android:color/white</item>
    </style>
  3. app:titleTextAppearance="@style/TextAppearance.TabsFont"नीचे दिखाए गए अनुसार अपने टूलबार गुणों में एक नई लाइन डालें

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:titleTextAppearance="@style/TitleBarTextAppearance"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>
  4. कस्टम एक्शनबार शीर्षक फ़ॉन्ट स्टाइल का आनंद लें !!


2
यह टूलबार के लिए बहुत अच्छा है। इस ऐप-वाइड को करने का कोई भी तरीका, जैसे जब आप एक नई गतिविधि में डिफ़ॉल्ट ऐप बार रखते हैं?
जॉर्डन एच

14

सुलेख पुस्तकालय देना आप अनुप्रयोग विषय है, जो भी कार्रवाई बार पर लागू होगा के माध्यम से एक कस्टम फ़ॉन्ट सेट है।

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
   <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>

कॉलिग्राफी को सक्रिय करने में लगने वाले सभी इसे आपकी गतिविधि के संदर्भ में संलग्न करना है:

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

डिफ़ॉल्ट कस्टम विशेषता है fontPath, लेकिन आप अपने अनुप्रयोग वर्ग में इसे प्रारंभ करके पथ के लिए अपनी स्वयं की कस्टम विशेषता प्रदान कर सकते हैं CalligraphyConfig.Builder। के उपयोग android:fontFamilyको हतोत्साहित किया गया है।


इस समाधान के लिए मिन एपीआई 16
सामी एल्तामावी

minSdk 7 प्रोजेक्ट की बिल्ड फ़ाइल के अनुसार, लेकिन मैं इसे minSdk 18 प्रोजेक्ट में उपयोग कर रहा हूं और इसके बाद कोई और जाँच नहीं की। आपत्तिजनक विधि का क्या उपयोग किया जाता है?
थाउटबेकर्स

इसका मिनिमम API 7, जस्ट उदाहरण API16 है। यह
Chris.Jenkins

11

यह एक बदसूरत हैक है, लेकिन आप इसे इस तरह से कर सकते हैं (चूंकि एक्शन_बार_टाइटल छिपा हुआ है):

    try {
        Integer titleId = (Integer) Class.forName("com.android.internal.R$id")
                .getField("action_bar_title").get(null);
        TextView title = (TextView) getWindow().findViewById(titleId);
        // check for null and manipulate the title as see fit
    } catch (Exception e) {
        Log.e(TAG, "Failed to obtain action bar title reference");
    }

यह कोड GINGERBREAD उपकरणों के लिए है, लेकिन इसे एक्शनबार शर्लक के साथ भी काम करने के लिए आसानी से बढ़ाया जा सकता है

PS @pjv टिप्पणी के आधार पर एक्शन बार टाइटल आईडी खोजने का एक बेहतर तरीका है

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");

4
मैं stackoverflow.com/questions/10779037/… में dtmilano के जवाब को प्राथमिकता देता हूं । यह समान है लेकिन भविष्य में थोड़ा अधिक प्रमाण है।
pjv

1
@pjv - सहमत हुए। कम "हैकी" लगता है। मैंने अपना जवाब संशोधित किया
बोसोन

1
तो सवाल कस्टम फ़ॉन्ट के बारे में है। यह उत्तर देता है कि डिफ़ॉल्ट एक्शनबार का टेक्स्ट व्यू कैसे प्राप्त करें
एलिकएल्ज़िन-किलोका

@ तिलक - विचार यह था कि यदि आप कस्टम फ़ॉन्ट सेट करने के लिए पाठ दृश्य प्राप्त करते हैं तो यह तुच्छ होगा। यह, हालांकि एक पुराने पोस्ट है मुझे लगता है कि twaddington जवाब ज्यादा पसंद किया जाता है
Bostone

8

निम्नलिखित कोड सभी संस्करणों के लिए काम करेगा। मैंने इसे जिंजरब्रेड के साथ-साथ जेलीन डिवाइस पर भी जांचा

 private void actionBarIdForAll()
    {
        int titleId = 0;

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
        {
            titleId = getResources().getIdentifier("action_bar_title", "id", "android");
        }
        else
        {
          // This is the id is from your app's generated R class when ActionBarActivity is used for SupportActionBar

            titleId = R.id.action_bar_title;
        }

        if(titleId>0)
        {
            // Do whatever you want ? It will work for all the versions.

            // 1. Customize your fonts
            // 2. Infact, customize your whole title TextView

            TextView titleView = (TextView)findViewById(titleId);
            titleView.setText("RedoApp");
            titleView.setTextColor(Color.CYAN);
        }
    }

यह मेरे लिए ActionBar और AppCompat ActionBar दोनों पर काम करता है। लेकिन उत्तरार्द्ध केवल तभी काम करता है जब मैं ऑनक्रीट () के बाद शीर्षक दृश्य को खोजने की कोशिश करता हूं, इसलिए उदाहरण के लिए इसे ऑनपोस्ट्रीट () पर रखने की कोशिश करता है।
हर्री

8

लायब्रेरी में नए टूलबार का उपयोग करें अपने एक्शनबार को अपने अनुसार डिज़ाइन करें या कोड के नीचे उपयोग करें

टेक्स्टव्यू को इन्फ्लेशन करना एक अच्छा विकल्प नहीं है, स्पैननेबल स्ट्रिंग बिल्डर की कोशिश करें

Typeface font2 = Typeface.createFromAsset(getAssets(), "fonts/<your font in assets folder>");   
SpannableStringBuilder SS = new SpannableStringBuilder("MY Actionbar Tittle");
SS.setSpan (new CustomTypefaceSpan("", font2), 0, SS.length(),Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
actionBar.setTitle(ss);

कक्षा के नीचे कॉपी करें

public class CustomTypefaceSpan extends TypefaceSpan{

    private final Typeface newType;

    public CustomTypefaceSpan(String family, Typeface type) {
        super(family);
        newType = type;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        applyCustomTypeFace(ds, newType);
    }

    @Override
    public void updateMeasureState(TextPaint paint) {
        applyCustomTypeFace(paint, newType);
    }

    private static void applyCustomTypeFace(Paint paint, Typeface tf) {
        int oldStyle;
        Typeface old = paint.getTypeface();
        if (old == null) {
            oldStyle = 0;
        } else {
            oldStyle = old.getStyle();
        }

        int fake = oldStyle & ~tf.getStyle();
        if ((fake & Typeface.BOLD) != 0) {
            paint.setFakeBoldText(true);
        }

        if ((fake & Typeface.ITALIC) != 0) {
            paint.setTextSkewX(-0.25f);
        }

        paint.setTypeface(tf);
    }

}

7
    ActionBar actionBar = getSupportActionBar();
    TextView tv = new TextView(getApplicationContext());
    Typeface typeface = ResourcesCompat.getFont(this, R.font.monotype_corsiva);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT, // Width of TextView
            RelativeLayout.LayoutParams.WRAP_CONTENT); // Height of TextView
    tv.setLayoutParams(lp);
    tv.setText("Your Text"); // ActionBar title text
    tv.setTextSize(25);
    tv.setTextColor(Color.WHITE);
    tv.setTypeface(typeface, typeface.ITALIC);
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    actionBar.setCustomView(tv);

ग्रेट यह पूरी तरह से काम कर रहा है मैं इस ऐप बार को केंद्र में कैसे ला सकता हूं?
प्रसार

एक आकर्षण की तरह काम कर रहे हैं .. बस के typeface.ITALICसाथ बदलने के Typeface.ITALICलिए कोई स्थिर सदस्य चेतावनी है
Zain

3

यदि आप संपूर्ण गतिविधि में सभी TextViews के लिए टाइपफेस सेट करना चाहते हैं, तो आप इस तरह से कुछ का उपयोग कर सकते हैं:

public static void setTypefaceToAll(Activity activity)
{
    View view = activity.findViewById(android.R.id.content).getRootView();
    setTypefaceToAll(view);
}

public static void setTypefaceToAll(View view)
{
    if (view instanceof ViewGroup)
    {
        ViewGroup g = (ViewGroup) view;
        int count = g.getChildCount();
        for (int i = 0; i < count; i++)
            setTypefaceToAll(g.getChildAt(i));
    }
    else if (view instanceof TextView)
    {
        TextView tv = (TextView) view;
        setTypeface(tv);
    }
}

public static void setTypeface(TextView tv)
{
    TypefaceCache.setFont(tv, TypefaceCache.FONT_KOODAK);
}

और TypefaceCache:

import java.util.TreeMap;

import android.graphics.Typeface;
import android.widget.TextView;

public class TypefaceCache {

    //Font names from asset:
    public static final String FONT_ROBOTO_REGULAR = "fonts/Roboto-Regular.ttf";
    public static final String FONT_KOODAK = "fonts/Koodak.ttf";

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

    public static Typeface getFont(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if(tf == null) {
            try {
                tf = Typeface.createFromAsset(MyApplication.getAppContext().getAssets(), fontName);
            }
            catch (Exception e) {
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

    public static void setFont(TextView tv, String fontName)
    {
        tv.setTypeface(getFont(fontName));
    }
}

3

मैंने अभी onCreate () फ़ंक्शन के अंदर निम्नलिखित कार्य किया:

TypefaceSpan typefaceSpan = new TypefaceSpan("font_to_be_used");
SpannableString str = new SpannableString("toolbar_text");
str.setSpan(typefaceSpan,0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(str);

मैं समर्थन पुस्तकालयों का उपयोग कर रहा हूं, यदि आप उनका उपयोग नहीं कर रहे हैं तो मुझे लगता है कि आपको getSupportActionBar () के बजाय getActionBar () पर स्विच करना चाहिए।

एंड्रॉइड स्टूडियो 3 में आप इस निर्देश के बाद कस्टम फोंट जोड़ सकते हैं https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html और फिर "अपने नए जोड़े गए फ़ॉन्ट का उपयोग करें" font_to_be_used "


1

@ Sam_D के उत्तर में जोड़ने के लिए, मुझे यह काम करने के लिए ऐसा करना पड़ा:

this.setTitle("my title!");
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());
TextView title = ((TextView)v.findViewById(R.id.title));
title.setEllipsize(TextUtils.TruncateAt.MARQUEE);
title.setMarqueeRepeatLimit(1);
// in order to start strolling, it has to be focusable and focused
title.setFocusable(true);
title.setSingleLine(true);
title.setFocusableInTouchMode(true);
title.requestFocus();

ऐसा लगता है कि ओवरकिल - दो बार v.findViewById (R.id.title) को संदर्भित करता है - लेकिन यह एकमात्र तरीका है जो मुझे ऐसा करने देगा।


1

सही उत्तर को अपडेट करने के लिए।

सबसे पहले: शीर्षक को गलत पर सेट करें, क्योंकि हम कस्टम दृश्य का उपयोग कर रहे हैं

    actionBar.setDisplayShowTitleEnabled(false);

दूसरी बात: titleview.xml बनाएं

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:color/transparent" >

    <TextView
       android:id="@+id/title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:textSize="20dp"
       android:maxLines="1"
       android:ellipsize="end"
       android:text="" />

</RelativeLayout>

अंततः :

//font file must be in the phone db so you have to create download file code
//check the code on the bottom part of the download file code.

   TypeFace font = Typeface.createFromFile("/storage/emulated/0/Android/data/"   
    + BuildConfig.APPLICATION_ID + "/files/" + "font name" + ".ttf");

    if(font != null) {
        LayoutInflater inflator = LayoutInflater.from(this);
        View v = inflator.inflate(R.layout.titleview, null);
        TextView titleTv = ((TextView) v.findViewById(R.id.title));
        titleTv.setText(title);
        titleTv.setTypeface(font);
        actionBar.setCustomView(v);
    } else {
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle("  " + title); // Need to add a title
    }

DOWNLOAD FONT FILE: क्योंकि मैं फाइल को क्लाउडिनरी में स्टोर कर रहा हूं इसलिए इसे डाउनलोड करने के लिए मेरे पास इस पर लिंक है।

/**downloadFile*/
public void downloadFile(){
    String DownloadUrl = //url here
    File file = new File("/storage/emulated/0/Android/data/" + BuildConfig.APPLICATION_ID + "/files/");
    File[] list = file.listFiles();
    if(list == null || list.length <= 0) {
        BroadcastReceiver onComplete = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                try{
                    showContentFragment(false);
                } catch (Exception e){
                }
            }
        };

        registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl));
        request.setVisibleInDownloadsUi(false);
        request.setDestinationInExternalFilesDir(this, null, ModelManager.getInstance().getCurrentApp().getRegular_font_name() + ".ttf");
        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);
    } else {
        for (File files : list) {
            if (!files.getName().equals("font_name" + ".ttf")) {
                BroadcastReceiver onComplete = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        try{
                            showContentFragment(false);
                        } catch (Exception e){
                        }
                    }
                };

                registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl));
                request.setVisibleInDownloadsUi(false);
                request.setDestinationInExternalFilesDir(this, null, "font_name" + ".ttf");
                DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                manager.enqueue(request);
            } else {
                showContentFragment(false);
                break;
            }
        }
    }
}

1

कोई कस्टम टेक्स्टव की आवश्यकता नहीं है!

सबसे पहले, अपने जावा कोड में इनोबार में शीर्षक को निष्क्रिय करें: getSupportActionBar ()। SetDisplayShowTitleEnabled (गलत);

उसके बाद, टूलबार के अंदर केवल एक TextView जोड़ें:

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:textSize="18sp"
        android:fontFamily="@font/roboto" />

    </android.support.v7.widget.Toolbar>

यह नवीनतम नेविगेशन UI जेटपैक पुस्तकालयों के साथ काम नहीं करेगा
अली असीर

1

यह प्रयोग करके देखें

TextView headerText= new TextView(getApplicationContext());
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
headerText.setLayoutParams(lp);
headerText.setText("Welcome!");
headerText.setTextSize(20);
headerText.setTextColor(Color.parseColor("#FFFFFF"));
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/wesfy_regular.ttf");
headerText.setTypeface(tf);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(headerText);

0

हमें इसे प्राप्त करने के लिए प्रतिबिंबों का उपयोग करने की आवश्यकता है

final int titleId = activity.getResources().getIdentifier("action_bar_title", "id", "android");

    final TextView title;
    if (activity.findViewById(titleId) != null) {
        title = (TextView) activity.findViewById(titleId);
        title.setTextColor(Color.BLACK);
        title.setTextColor(configs().getColor(ColorKey.GENERAL_TEXT));
        title.setTypeface(configs().getTypeface());
    } else {
        try {
            Field f = bar.getClass().getDeclaredField("mTitleTextView");
            f.setAccessible(true);
            title = (TextView) f.get(bar);
            title.setTextColor(Color.BLACK);
            title.setTypeface(configs().getTypeface());
        } catch (NoSuchFieldException e) {
        } catch (IllegalAccessException e) {
        }
    }

-1

इसे इस्तेमाल करे

public void findAndSetFont(){
        getActionBar().setTitle("SOME TEST TEXT");
        scanForTextViewWithText(this,"SOME TEST TEXT",new SearchTextViewInterface(){

            @Override
            public void found(TextView title) {

            } 
        });
    }

public static void scanForTextViewWithText(Activity activity,String searchText, SearchTextViewInterface searchTextViewInterface){
    if(activity == null|| searchText == null || searchTextViewInterface == null)
        return;
    View view = activity.findViewById(android.R.id.content).getRootView();
    searchForTextViewWithTitle(view, searchText, searchTextViewInterface);
}

private static void searchForTextViewWithTitle(View view, String searchText, SearchTextViewInterface searchTextViewInterface)
{
    if (view instanceof ViewGroup)
    {
        ViewGroup g = (ViewGroup) view;
        int count = g.getChildCount();
        for (int i = 0; i < count; i++)
            searchForTextViewWithTitle(g.getChildAt(i), searchText, searchTextViewInterface);
    }
    else if (view instanceof TextView)
    {
        TextView textView = (TextView) view;
        if(textView.getText().toString().equals(searchText))
            if(searchTextViewInterface!=null)
                searchTextViewInterface.found(textView);
    }
}
public interface SearchTextViewInterface {
    void found(TextView title);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.