Jak ustawić niestandardową czcionkę w tytule ActionBar?

257

W jaki sposób (jeśli to możliwe) mogę ustawić niestandardową czcionkę w tekście tytułu ActionBar (tylko - nie tekst tabulatora) z czcionką w folderze zasobów? Nie chcę używać opcji Androida: logo.

vidstige
źródło

Odpowiedzi:

211

Zgadzam się, że nie jest to w pełni obsługiwane, ale oto co zrobiłem. Możesz użyć niestandardowego widoku dla paska akcji (będzie wyświetlany między ikoną a elementami akcji). Korzystam z widoku niestandardowego i mam wyłączony natywny tytuł. Wszystkie moje działania dziedziczą po jednym działaniu, które ma ten kod w 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);

A mój układ xml (R.layout.titleview w powyższym kodzie) wygląda następująco:

<?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
źródło
1
Działa to dobrze w przypadku tytułu, ale jeśli chcesz tytuł i karty, umieszcza niestandardowy widok po prawej stronie kart, a nie w lewo, tak jak w tytule. Chciałbym móc zmienić tytuł.
draksia
2
Świetne rozwiązanie. Jeśli potrzebujesz niestandardowej klasy widoku tekstu, która umożliwia specyfikację czcionki w XML, wypróbuj moją! github.com/tom-dignan/nifty - to bardzo proste.
Thomas Dignan
Czy ten kod musi być w onCreate ()? Muszę ustawić to dynamicznie poza moją aktywnością ...
IgorGanapolsky
musisz dynamicznie zmieniać czcionkę? czy po prostu chcesz zmienić tytuł, gdy czcionka jest już dostosowana?
Sam Dozor,
2
To działa, ale jest to droga do dużej pracy. Plus: tracisz niektóre funkcje standardowego tytułu, takie jak podświetlanie go po kliknięciu ikony ... Nie można używać niestandardowych tytułów do ponownego tworzenia standardowego układu tytułów tylko do zmiany czcionek ...
Zordid,
422

Możesz to zrobić za pomocą niestandardowej TypefaceSpanklasy. Jest lepszy od customViewpodejścia wskazanego powyżej, ponieważ nie psuje się podczas korzystania z innych elementów paska akcji, takich jak rozwijanie widoków akcji.

Zastosowanie takiej klasy wyglądałoby mniej więcej tak:

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

Do TypefaceSpanklasy niestandardowej przekazywany jest kontekst działania i nazwa kroju pisma w assets/fontskatalogu. Ładuje plik i buforuje nowe Typefacewystąpienie w pamięci. Pełna implementacja TypefaceSpanjest zaskakująco prosta:

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

Po prostu skopiuj powyższą klasę do swojego projektu i zaimplementuj ją w onCreatemetodzie działania, jak pokazano powyżej.

Twaddington
źródło
20
Niezła odpowiedź. Dobrze jest zobaczyć, że pokazałeś również sposób buforowania elementu kroju pisma.
Anand Sainath
6
To jest wspaniałe. Jedna gotcha - jeśli textAllCapsatrybut jest ustawiony na true w bazowym TextView (np. Poprzez motyw), czcionka niestandardowa nie pojawi się. Był to dla mnie problem, kiedy zastosowałem tę technikę do elementów zakładki paska akcji.
James
4
Zauważ, że ta implementacja klasy zakłada, że ​​wstawiasz pliki czcionek assets/fonts/. Jeśli po prostu wrzucić pliki .ttf / .OTF w aktywach, a nie w podkatalogu, należy zmodyfikować poniższy wiersz kodu odpowiednio: String.format("fonts/%s", typefaceName). Straciłem dobre 10 minut, próbując to rozgryźć. Jeśli tego nie zrobisz, otrzymaszjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt,
1
W momencie uruchomienia aplikacji widoczny jest domyślny styl tytułu, a około 1 sekundy później pojawia się styl niestandardowy. Zły interfejs użytkownika ...
Głosowanie
2
To świetna odpowiedź i pomogła mi wydostać się z tony. Jednym z ulepszeń, które chciałbym dodać, byłoby przeniesienie mechanizmu buforowania do własnej klasy poza TypefaceSpan. Natknąłem się na inne sytuacje, w których korzystałem z kroju pisma bez zakresu, co pozwoliło mi również skorzystać z pamięci podręcznej w takich sytuacjach.
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);
Cyfra
źródło
2
To powinna być preferowana odpowiedź na pytanie. Działa świetnie, również z „action_bar_subtitle”! Dzięki!
Zordid
20
jeśli programiści Androida w nowszej wersji zmienią identyfikator zasobu z „action_bar_title” na inną nazwę, nic z tego nie zadziała. dlatego nie jest tak wysoko głosowany.
Diogo Bento
6
Działa na api> 3.0, ale nie w wersji 2.x dla appcompat
Aman Singhal
1
To zmienia czcionkę i wszystko. Ale kiedy przejdę do następnej aktywności i wcisnąłem wstecz, czcionka zostanie przywrócona. Myślę, że ma to coś wspólnego z właściwościami ActionBar.
Pranav Mahajan
11
@Digit: To działało świetnie w przypadku „Holo Theme”, ale nie działa w przypadku „Material Theme” (Android L). TitleId został znaleziony, ale widok tekstu jest pusty .. jakieś pomysły, jak to naprawić? dzięki!
Michael D.
34

Od Android Support Library v26 + Android Studio 3.0 proces ten stał się prosty jak błyskawica !!

Wykonaj następujące kroki, aby zmienić czcionkę tytułu paska narzędzi:

  1. Czytaj pobrania czcionek i wybrać dowolną czcionkę z listy ( moje zalecenie ) lub załadować czcionkę niestandardową res > fontzgodnie Fonts w XML
  2. W res > values > styleswklej następujące ( użyj tutaj swojej wyobraźni! )

    <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. Wstaw nowy wiersz we właściwościach paska narzędzi Toolbar, app:titleTextAppearance="@style/TextAppearance.TabsFont"jak pokazano poniżej

    <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. Ciesz się stylem czcionki niestandardowego tytułu Actionbar !!

Mohammed Mukhtar
źródło
2
Jest to idealne rozwiązanie dla pasków narzędzi. W jaki sposób możesz to zrobić w całej aplikacji, na przykład gdy masz nowy pasek aplikacji w nowej aktywności?
Jordan H
14

Kaligrafia let Biblioteki ustawić czcionkę niestandardową przez app motywu, który będzie również zastosowanie do paska akcji.

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

Aby aktywować kaligrafię, wystarczy dołączyć ją do kontekstu działania:

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

Domyślny atrybut niestandardowy to fontPath, ale możesz podać własny atrybut niestandardowy dla ścieżki, inicjując go w klasie aplikacji za pomocą CalligraphyConfig.Builder. Stosowanie android:fontFamilyzostało zniechęcone.

thoutbeckers
źródło
Min API 16 dla tego rozwiązania
Sami Eltamawy
minSdk 7 zgodnie z plikiem kompilacji projektu, ale używam tego w projekcie minSdk 18 i nie sprawdziłem tego dalej. Jaka jest stosowana metoda przestępstwa?
thoutbeckers
Jego min API 7, tylko przykładem jest API16. obsługuje appcompat-v7 +
Chris.Jenkins
11

To brzydki hack, ale możesz to zrobić w następujący sposób (ponieważ action_bar_title jest ukryty):

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

Ten kod dotyczy urządzeń post GINGERBREAD, ale można go łatwo rozszerzyć, aby działał również z paskiem akcji Sherlock

PS Na podstawie komentarza @pjv istnieje lepszy sposób na znalezienie identyfikatora tytułu paska akcji

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
Bostone
źródło
4
Wolę odpowiedź dtmilano w stackoverflow.com/questions/10779037/... . Jest podobny, ale nieco bardziej przyszłościowy.
pjv,
1
@pjv - uzgodnione. Wydaje się mniej „hacky”. Zmodyfikowałem swoją odpowiedź
Bostone
1
Pytanie dotyczy więc niestandardowej czcionki. To odpowiada, jak uzyskać widok tekstowy domyślnego paska akcji .
AlikElzin-kilaka
@kilaka - pomysł polegał na tym, że jeśli uzyskasz ustawienie widoku tekstu, niestandardowa czcionka byłaby trywialna. To jest stary post, ale myślę, że odpowiedź twaddington jest zdecydowanie preferowana
Bostone
8

Poniższy kod będzie działał dla wszystkich wersji. Sprawdziłem to w urządzeniu z piernikiem, a także w urządzeniu 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);
        }
    }
Napoleona
źródło
Działa to zarówno na ActionBar, jak i AppCompat ActionBar. Ale to ostatnie działa tylko wtedy, gdy próbuję znaleźć widok tytułu po onCreate (), więc na przykład umieszczenie go w onPostCreate () załatwia sprawę.
Harri
8

użyj nowego paska narzędzi w bibliotece wsparcia, zaprojektuj pasek akcji jako własny lub użyj kodu poniżej

Nadmuchiwanie widoku tekstu nie jest dobrą opcją. Wypróbuj narzędzie do tworzenia ciągów znaków 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);

skopiuj poniżej klasy

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
źródło
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
źródło
Świetnie Działa to doskonale. Jak mogę umieścić ten pasek aplikacji w centrum?
Prasath
działa jak czar .. po prostu wymienić typeface.ITALICsię Typeface.ITALICnie mieć ostrzeżenie użytkownika statyczne
Zain
3

Jeśli chcesz ustawić krój pisma dla wszystkich widoków tekstu w całym działaniu, możesz użyć czegoś takiego:

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

I 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));
    }
}
użytkownik2136334
źródło
3

Właśnie wykonałem następujące czynności w funkcji 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);

Korzystam z bibliotek wsparcia, jeśli ich nie używasz, myślę, że powinieneś przełączyć się na getActionBar () zamiast getSupportActionBar ().

W Android Studio 3 możesz dodać niestandardowe czcionki, postępując zgodnie z tymi instrukcjami https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html, a następnie użyj nowo dodanej czcionki w „ font_to_be_used "

Siedem
źródło
1

Aby dodać do odpowiedzi @ Sam_D, musiałem to zrobić, aby działało:

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

Wygląda to na przesadę - dwukrotne odwołanie się do v.findViewById (R.id.title)) - ale to jedyny sposób, w jaki pozwoliłbym to zrobić.

Igor Ganapolski
źródło
1

Aby zaktualizować poprawną odpowiedź.

po pierwsze: ustaw tytuł na false, ponieważ używamy widoku niestandardowego

    actionBar.setDisplayShowTitleEnabled(false);

po drugie: utwórz 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>

Wreszcie:

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

POBIERZ PLIK FONTOWY: ponieważ przechowuję plik w chmurze, więc mam na nim link do pobrania.

/**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
źródło
1

Nie jest wymagany niestandardowy widok tekstu!

Najpierw wyłącz tytuł na pasku narzędzi w kodzie Java: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Następnie po prostu dodaj TextView do paska narzędzi:

<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
źródło
to nie będzie działać z najnowszymi bibliotekami jetpack interfejsu użytkownika
Ali Asheer,
1

Spróbuj użyć tego

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
źródło
0

Aby to osiągnąć, musimy użyć refleksji

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
źródło
-1

SPRÓBUJ TEGO

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);
}
użytkownik2212515
źródło