วิธีการตั้งค่าแบบอักษรที่กำหนดเองในชื่อ ActionBar?


257

ฉันจะตั้งค่าแบบอักษรที่กำหนดเองได้อย่างไรในข้อความหัวเรื่องของ ActionBar (เท่านั้น - ไม่ใช่ข้อความแท็บ) ด้วยแบบอักษรในโฟลเดอร์เนื้อหาของฉัน ฉันไม่ต้องการใช้ตัวเลือกโลโก้ 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
วิธีนี้ใช้งานได้ดีสำหรับชื่อเรื่อง แต่ถ้าคุณต้องการชื่อเรื่องและแท็บมันจะทำให้มุมมองที่กำหนดเองทางด้านขวาของแท็บที่ไม่เหลือเหมือนชื่อเรื่อง ฉันชอบที่จะสามารถเปลี่ยนชื่อจริง
draksia

2
ทางออกที่ดี หากคุณต้องการคลาสมุมมองข้อความที่กำหนดเองที่อนุญาตให้ใช้คุณสมบัติของแบบอักษรใน XML โปรดลองของฉัน! github.com/tom-dignan/nifty - ง่ายมาก
โทมัส Dignan

รหัสนี้ต้องอยู่ใน onCreate () หรือไม่ ฉันจะต้องตั้งมันแบบไดนามิกนอกกิจกรรมของฉัน ...
IgorGanapolsky

คุณต้องเปลี่ยนแบบอักษรแบบไดนามิก? หรือคุณแค่ต้องการเปลี่ยนชื่อเมื่อแบบอักษรที่กำหนดเองอยู่แล้ว?
Sam Dozor

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
คำตอบที่ดี มีอะไรดีให้ดูคือคุณยังได้แสดงวิธีการแคชองค์ประกอบแบบอักษร
Anand Sainath

6
มันยอดเยี่ยมมาก หนึ่ง gotcha - ถ้าtextAllCapsแอตทริบิวต์ถูกตั้งค่าเป็นจริงบน TextView พื้นฐาน (เช่นผ่านชุดรูปแบบ) จากนั้นแบบอักษรที่กำหนดเองจะไม่ปรากฏขึ้น นี่เป็นปัญหาสำหรับฉันเมื่อฉันใช้เทคนิคนี้กับรายการแท็บแถบการกระทำ
James

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 วินาทีต่อมาสไตล์ที่กำหนดเองจะปรากฏขึ้น Bad UI ...
โหวตขึ้น

2
นี่เป็นคำตอบที่ยอดเยี่ยมและช่วยฉันออกมามากมาย การปรับปรุงอย่างหนึ่งที่ฉันจะเพิ่มคือการย้ายกลไกการแคชไปยังคลาสของตัวเองนอก TypefaceSpan ฉันวิ่งเข้าไปในสถานการณ์อื่นที่ฉันใช้ Typeface โดยไม่มีการเว้นช่วงและสิ่งนี้ทำให้ฉันสามารถใช้ประโยชน์จากแคชในสถานการณ์เหล่านั้นได้เช่นกัน
Justin

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
นี่ควรเป็นคำตอบที่ต้องการสำหรับคำถาม ใช้งานได้ดีด้วย "action_bar_subtitle"! ขอบคุณ!
Zordid

20
หากนักพัฒนา android ในรุ่นที่ใหม่กว่าเปลี่ยน id ทรัพยากรจาก "action_bar_title" เป็นชื่ออื่นดังนั้นจะไม่มีการทำงานใด ๆ นั่นเป็นเหตุผลที่มันไม่ได้ลงคะแนน
Diogo Bento

6
ใช้งานได้กับ api> 3.0 แต่ไม่ได้อยู่ใน 2.x สำหรับ appcompat
Aman Singhal

1
สิ่งนี้จะเปลี่ยนแบบอักษรและทุกสิ่ง แต่เมื่อฉันข้ามไปกิจกรรมถัดไป & กดย้อนกลับแบบอักษรจะถูกเปลี่ยนกลับ ฉันเดาว่ามันเกี่ยวข้องกับคุณสมบัติของ ActionBar
Pranav Mahajan

11
@Digit: มันใช้งานได้ดีสำหรับ "Holo Theme" แต่ไม่ได้สำหรับ "Material Theme" (android L) พบ TitleId แต่ textview นั้นว่างเปล่า .. มีแนวคิดใดที่จะแก้ไขปัญหานี้? ขอบคุณ!
Michael D.

34

จากAndroid Support Library v26 + Android Studio 3.0เป็นต้นไปกระบวนการนี้กลายเป็นเรื่องง่ายเหมือนสะบัด !!

ทำตามขั้นตอนเหล่านี้เพื่อเปลี่ยนแบบอักษรของชื่อแถบเครื่องมือ:

  1. อ่าน แบบอักษรที่ดาวน์โหลดได้และเลือกแบบอักษรใด ๆ จากรายการ ( คำแนะนำของฉัน ) หรือโหลดแบบอักษรที่กำหนดเองres > fontตามแบบอักษรใน XML
  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. แทรกบรรทัดใหม่ในคุณสมบัติ Toolbar ของคุณ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. เพลิดเพลินกับการจัดแต่งทรงผมแบบอักษรของ Actionbar Title Custom !!


2
เหมาะสำหรับแถบเครื่องมือ มีวิธีใดบ้างในการทำทั้งแอพเช่นเมื่อคุณมีแถบแอพเริ่มต้นในกิจกรรมใหม่
Jordan H

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หมดกำลังใจ


API ขั้นต่ำ 16 สำหรับโซลูชันนี้
Sami Eltamawy

minSdk 7 ตามไฟล์บิวด์ของโปรเจ็กต์ แต่ฉันใช้มันในโปรเจ็กต์ minSdk 18 และไม่ได้ทำการตรวจสอบเพิ่มเติมอีก วิธีการที่ผิดใช้อะไร?
thoutbeckers

มันต่ำสุด API 7 เพียงตัวอย่างคือ API16 มันรองรับ appcompat-v7 +
Chris.Jenkins

11

มันเป็นแฮ็คที่น่าเกลียด แต่คุณสามารถทำได้เช่นนี้ (เนื่องจาก action_bar_title ถูกซ่อนอยู่):

    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 แต่สามารถขยายได้อย่างง่ายดายในการทำงานกับ Actionbar Sherlock เช่นกัน

PS จากความคิดเห็น @pjv มีวิธีที่ดีกว่าในการค้นหา id ชื่อแถบการกระทำ

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

4
ฉันชอบคำตอบ dtmilano ในstackoverflow.com/questions/10779037/... มันคล้ายกัน แต่มีการพิสูจน์เพิ่มเติมในอนาคตเล็กน้อย
pjv

1
@pjv - เห็นด้วย ดูเหมือนว่า "แฮ็ค" น้อยกว่า ฉันแก้ไขคำตอบของฉัน
Bostone

1
ดังนั้นคำถามเกี่ยวกับตัวอักษรที่กำหนดเอง นี้จะตอบว่าจะได้รับมุมมองข้อความของ actionbar
AlikElzin-kilaka

@kilaka - ความคิดคือถ้าคุณได้รับมุมมองข้อความการตั้งค่าแบบอักษรที่กำหนดเองจะไม่สำคัญ นี่คือโพสต์เก่า แต่ฉันคิดว่าคำตอบ twaddington เป็นที่ต้องการมาก
Bostone

8

รหัสต่อไปนี้จะใช้ได้กับทุกรุ่น ฉันตรวจสอบสิ่งนี้ในอุปกรณ์ที่มีขนมปังขิงรวมทั้งบนอุปกรณ์ JellyBean

 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 แต่สิ่งหลังใช้งานได้ก็ต่อเมื่อฉันพยายามค้นหามุมมองหัวเรื่องหลัง onCreate () ดังนั้นตัวอย่างเช่นการวางไว้บน
Harri

8

ใช้แถบเครื่องมือใหม่ในการสนับสนุนไลบรารีออกแบบ actionbar ของคุณเองหรือใช้โค้ดด้านล่าง

การขยาย Textview ไม่ใช่ตัวเลือกที่ดีลองใช้ตัวสร้างสตริง Spannable

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);

เยี่ยมมากทำงานได้อย่างสมบูรณ์แบบฉันจะนำแอพนี้ไปไว้ตรงกลางได้อย่างไร
Prasath

ทำงานเหมือนมีเสน่ห์ .. เพียงแค่แทนที่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);

ฉันใช้ห้องสมุดสนับสนุนถ้าคุณไม่ได้ใช้ฉันคิดว่าคุณควรเปลี่ยนไปใช้ getActionBar () แทน getSupportActionBar ()

ใน Android Studio 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();

ดูเหมือนว่า overkill - การอ้างอิง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
    }

ดาวน์โหลด FONT FILE: เพราะฉันกำลังจัดเก็บไฟล์ไว้ใน cloudinary ดังนั้นฉันจึงมีลิงก์สำหรับดาวน์โหลด

/**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

ไม่จำเป็นต้องใช้มุมมองข้อความเอง!

ก่อนอื่นให้ปิดการใช้งานหัวเรื่องใน toobar ในรหัส java ของคุณ: getSupportActionBar (). setDisplayShowTitleEnabled (false);

จากนั้นเพิ่ม 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 jetpack การนำทางล่าสุด
Ali Asheer

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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.