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.

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>

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.


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

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


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.


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

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

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

}

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

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

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 "


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


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

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>

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

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

-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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.