Bagaimana Cara Mengatur Font Kustom di Judul ActionBar?

257

Bagaimana (jika mungkin) saya bisa mengatur font khusus dalam teks judul ActionBar (hanya - bukan teks tab) dengan font di folder aset saya? Saya tidak ingin menggunakan opsi android: logo.

vidstige
sumber

Jawaban:

211

Saya setuju bahwa ini tidak sepenuhnya didukung, tetapi inilah yang saya lakukan. Anda dapat menggunakan tampilan khusus untuk bilah tindakan Anda (ini akan menampilkan antara ikon Anda dan item tindakan Anda). Saya menggunakan tampilan khusus dan judul asli saya dinonaktifkan. Semua aktivitas saya mewarisi dari satu aktivitas, yang memiliki kode ini di 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);

Dan tata letak saya xml (R.layout.titleview dalam kode di atas) terlihat seperti ini:

<?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>
Sam Dozor
sumber
1
Ini berfungsi dengan baik untuk judul tetapi jika Anda ingin judul dan tab itu menempatkan tampilan kustom di sebelah kanan tab tidak kiri seperti judulnya. Saya ingin sekali dapat mengubah judul yang sebenarnya.
draksia
2
Solusi bagus Jika Anda memerlukan kelas tampilan teks khusus yang memungkinkan spesifikasi font dalam XML, silakan coba milikku! github.com/tom-dignan/nifty - sangat mudah.
Thomas Dignan
Apakah kode ini harus ada di onCreate ()? Saya perlu mengaturnya secara dinamis di luar aktivitas saya ...
IgorGanapolsky
Anda perlu mengubah font secara dinamis? atau apakah Anda hanya ingin mengubah judul setelah font sudah dikustomisasi?
Sam Dozor
2
Ini bekerja, tetapi ini adalah cara untuk banyak bekerja. Plus: Anda kehilangan beberapa fitur judul standar, seperti menyorotnya ketika ikon diklik ... Judul khusus tidak dimaksudkan untuk digunakan untuk membuat kembali tata letak judul standar hanya untuk mengubah font ...
Zordid
422

Anda dapat melakukan ini menggunakan TypefaceSpankelas khusus . Ini lebih unggul daripada customViewpendekatan yang ditunjukkan di atas karena tidak rusak ketika menggunakan elemen Action Bar lainnya seperti memperluas tampilan aksi.

Penggunaan kelas semacam itu akan terlihat seperti ini:

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

Kelas khusus TypefaceSpanditeruskan konteks Aktivitas Anda dan nama jenis huruf dalam assets/fontsdirektori Anda . Itu memuat file dan cache Typefacecontoh baru dalam memori. Implementasi lengkapnya TypefaceSpansangat sederhana:

/**
 * 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);
    }
}

Cukup salin kelas di atas ke proyek Anda dan terapkan dalam onCreatemetode aktivitas Anda seperti yang ditunjukkan di atas.

Twaddington
sumber
20
Jawaban bagus. Apa yang baik untuk dilihat adalah bahwa Anda juga telah menunjukkan cara untuk men-cache elemen typeface.
Anand Sainath
6
Ini luar biasa. Satu gotcha - jika textAllCapsatribut disetel ke true pada TextView yang mendasarinya (misalnya melalui tema), maka font khusus tidak akan muncul. Ini merupakan masalah bagi saya ketika saya menerapkan teknik ini ke item tab bilah tindakan.
James
4
Perhatikan bahwa implementasi kelas ini mengasumsikan bahwa Anda memasukkan file font Anda assets/fonts/. Jika Anda hanya membuang file .ttf / .otf bawah aset dan tidak dalam subfolder, Anda harus memodifikasi baris kode berikut sesuai: String.format("fonts/%s", typefaceName). Saya kehilangan 10 menit untuk memecahkannya. Jika tidak, Anda akan mendapatkanjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt
1
Pada saat memulai aplikasi, gaya judul default terlihat dan sekitar 1 detik kemudian gaya kustom muncul. UI buruk ...
Suara positif
2
Ini adalah jawaban yang bagus dan membantu saya keluar satu ton. Satu peningkatan yang saya tambahkan adalah memindahkan mekanisme caching ke kelasnya sendiri di luar TypefaceSpan. Saya berlari ke situasi lain di mana saya menggunakan Typeface tanpa rentang dan ini memungkinkan saya untuk mengambil keuntungan dari cache di situasi itu juga.
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);
Angka
sumber
2
Ini harus menjadi jawaban yang disukai untuk pertanyaan itu. Bekerja dengan baik, juga dengan "action_bar_subtitle"! Terima kasih!
Zordid
20
jika pengembang android dalam versi yang lebih baru mengubah id sumber daya dari "action_bar_title" ke nama lain, maka semua ini tidak akan berfungsi. itu sebabnya tidak begitu dipilih.
Diogo Bento
6
Bekerja pada api> 3.0 tetapi tidak dalam 2.x untuk appcompat
Aman Singhal
1
Ini mengubah font & segalanya. Tetapi ketika saya kebagian Kegiatan berikutnya & tekan kembali font akan dikembalikan. Saya kira itu ada hubungannya dengan properti ActionBar.
Pranav Mahajan
11
@ Digigit: Itu bekerja sangat baik untuk "Holo Theme", tetapi tidak untuk "Material Theme" (Android L). TitleId ditemukan, tetapi tampilan teksnya null .. ada ide bagaimana cara memperbaikinya? Terima kasih!
Michael D.
34

Dari Android Support Library v26 + Android Studio 3.0 dan seterusnya, proses ini menjadi semudah film !!

Ikuti langkah-langkah ini untuk mengubah font Judul Toolbar:

  1. Baca Font yang Dapat Diunduh & pilih font apa saja dari daftar ( rekomendasi saya ) atau muat font khusus res > fontsesuai dengan Font dalam XML
  2. Di res > values > styles, rekatkan yang berikut ( gunakan imajinasi Anda di sini! )

    <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. Masukkan baris baru di properti Bilah Alat Anda app:titleTextAppearance="@style/TextAppearance.TabsFont"seperti yang ditunjukkan di bawah ini

    <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. Nikmati styling font Judul Actionbar Kustom !!

Mohammed Mukhtar
sumber
2
Ini bagus untuk bilah alat. Adakah cara untuk melakukan ini di seluruh aplikasi, seperti ketika Anda memiliki bilah aplikasi default di aktivitas baru?
Jordan H
14

The Kaligrafi perpustakaan membiarkan kau menetapkan font khusus melalui tema app, yang juga akan berlaku untuk bar tindakan.

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

Yang diperlukan untuk mengaktifkan Kaligrafi adalah melampirkannya ke konteks Aktivitas Anda:

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

Atribut khusus default adalah fontPath, tetapi Anda dapat memberikan atribut khusus Anda sendiri untuk jalur dengan menginisialisasi di kelas Aplikasi Anda CalligraphyConfig.Builder. Penggunaan android:fontFamilytelah tidak disarankan.

pemalas
sumber
Min API 16 untuk solusi ini
Sami Eltamawy
minSdk 7 sesuai dengan file build proyek, tapi saya menggunakan ini dalam proyek minSdk 18 dan tidak melakukan pemeriksaan lebih lanjut. Apa metode menyinggung yang digunakan?
petarung
Itu min API 7, Contohnya saja adalah API16. ini mendukung appcompat-v7 +
Chris.Jenkins
11

Ini peretasan yang buruk, tetapi Anda bisa melakukannya seperti ini (karena action_bar_title disembunyikan):

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

Kode ini untuk perangkat post-GINGERBREAD tetapi ini dapat dengan mudah diperluas untuk bekerja dengan Sherlock actionbar juga

PS Berdasarkan komentar @pjv ada cara yang lebih baik untuk menemukan id judul bar tindakan

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
Bostone
sumber
4
Saya lebih suka jawaban dtmilano di stackoverflow.com/questions/10779037/… . Ini serupa tetapi sedikit lebih banyak bukti di masa depan.
pjv
1
@pjv - setuju. Tampak kurang "hacky". Saya mengubah jawaban saya
Bostone
1
Jadi pertanyaannya adalah tentang font khusus. Ini menjawab cara mendapatkan tampilan teks dari actionbar default .
AlikElzin-kilaka
@ silaka - idenya adalah bahwa jika Anda mendapatkan pengaturan tampilan teks font kustom akan sepele. Ini adalah posting lama, saya pikir jawaban twaddington jauh lebih disukai
Bostone
8

Kode berikut akan berfungsi untuk semua versi. Saya sudah memeriksa ini di perangkat dengan roti jahe serta pada perangkat 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);
        }
    }
Napolean
sumber
Ini berfungsi untuk saya di ActionBar dan AppCompat ActionBar. Tetapi yang terakhir hanya berfungsi jika saya mencoba menemukan tampilan judul setelah onCreate (), jadi misalnya menempatkannya pada onPostCreate () melakukan trik.
Harri
8

gunakan bilah alat baru di pustaka dukungan rancang bilah tindakan Anda sebagai milik Anda atau gunakan kode di bawah ini

Menggembungkan Textview bukan pilihan yang baik untuk mencoba pembuat String 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);

salin di bawah kelas

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

}
Jinu
sumber
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);
kapsid
sumber
Hebat Ini bekerja dengan sempurna bagaimana saya bisa menempatkan bilah aplikasi ini ke tengah?
Prasath
bekerja seperti mantra .. ganti saja typeface.ITALICdengan Typeface.ITALICtidak memiliki peringatan anggota statis
Zain
3

Jika Anda ingin mengatur jenis huruf untuk semua TextViews di seluruh Kegiatan Anda dapat menggunakan sesuatu seperti ini:

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

Dan 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));
    }
}
pengguna2136334
sumber
3

Saya baru saja melakukan yang berikut di dalam fungsi 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);

Saya menggunakan Perpustakaan Dukungan, jika Anda tidak menggunakannya saya kira Anda harus beralih ke getActionBar () alih-alih getSupportActionBar ().

Di Android Studio 3 Anda dapat menambahkan font khusus mengikuti petunjuk ini https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html dan kemudian gunakan font yang baru ditambahkan di " font_to_be_used "

Tujuh
sumber
1

Untuk menambahkan jawaban @ Sam_D, saya harus melakukan ini agar berfungsi:

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

Sepertinya berlebihan - merujuk v.findViewById (R.id.title)) dua kali - tapi hanya itu satu-satunya cara yang memungkinkan saya melakukannya.

IgorGanapolsky
sumber
1

Untuk memperbarui jawaban yang benar.

pertama: atur judul menjadi false, karena kami menggunakan tampilan khusus

    actionBar.setDisplayShowTitleEnabled(false);

kedua: buat 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>

Akhirnya :

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

UNDUH FILE FONT: karena saya menyimpan file ke cloudinary jadi saya punya tautan untuk mengunduhnya.

/**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;
            }
        }
    }
}
Andrew Indayang
sumber
1

Tidak diperlukan tampilan teks khusus!

Pertama, nonaktifkan judul di toobar dalam kode java Anda: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Kemudian, cukup tambahkan TextView di dalam toolbar:

<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>
Apurva Thorat
sumber
ini tidak akan berfungsi dengan perpustakaan terbaru navigasi jetpack UI
Ali Asheer
1

Coba gunakan ini

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);
Asendo
sumber
0

Kita perlu menggunakan refleksi untuk mencapai ini

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) {
        }
    }
Jiju Induchoodan
sumber
-1

COBA INI

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);
}
pengguna2212515
sumber