Comment définir une police personnalisée dans le titre ActionBar?

257

Comment (si possible) pourrais-je définir une police personnalisée dans un texte de titre ActionBar (uniquement - pas le texte de l'onglet) avec une police dans mon dossier d'actifs? Je ne veux pas utiliser l'option android: logo.

vidstige
la source

Réponses:

211

Je suis d'accord que ce n'est pas complètement pris en charge, mais voici ce que j'ai fait. Vous pouvez utiliser une vue personnalisée pour votre barre d'action (elle s'affichera entre votre icône et vos éléments d'action). J'utilise une vue personnalisée et le titre natif est désactivé. Toutes mes activités héritent d'une seule activité, qui a ce code dans 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);

Et mon layout xml (R.layout.titleview dans le code ci-dessus) ressemble à ceci:

<?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
la source
1
Cela fonctionne bien pour le titre, mais si vous voulez un titre et des onglets, il place la vue personnalisée à droite des onglets pas à gauche comme le serait le titre. J'adorerais pouvoir modifier le titre actuel.
draksia
2
Excellente solution. Si vous avez besoin d'une classe d'affichage de texte personnalisée qui permet de spécifier la police en XML, essayez la mienne! github.com/tom-dignan/nifty - c'est très simple.
Thomas Dignan
Ce code doit-il être dans onCreate ()? Je dois le définir dynamiquement en dehors de mon activité ...
IgorGanapolsky
vous devez changer la police dynamiquement? ou cherchez-vous simplement à changer le titre une fois que la police est déjà personnalisée?
Sam Dozor
2
Cela fonctionne, mais c'est beaucoup de travail. De plus: vous perdez certaines fonctionnalités du titre standard, comme le faire surligner lorsque l'icône est cliquée ... Les titres personnalisés ne sont pas destinés à être utilisés pour recréer la mise en page du titre standard uniquement pour changer les polices ...
Zordid
422

Vous pouvez le faire en utilisant une TypefaceSpanclasse personnalisée . C'est supérieur aucustomView approche indiquée ci-dessus, car il ne se casse pas lors de l'utilisation d'autres éléments de la barre d'action, comme l'expansion des vues d'action.

L'utilisation d'une telle classe ressemblerait à ceci:

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

La TypefaceSpanclasse personnalisée reçoit votre contexte d'activité et le nom d'une police de caractères dans votre assets/fontsrépertoire. Il charge le fichier et met en cache une nouvelle Typefaceinstance en mémoire. La mise en œuvre complète de TypefaceSpanest étonnamment simple:

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

Copiez simplement la classe ci-dessus dans votre projet et implémentez-la dans la onCreateméthode de votre activité, comme indiqué ci-dessus.

twaddington
la source
20
Bonne réponse. Ce qui est bien à voir, c'est que vous avez également montré un moyen de mettre en cache l'élément de police.
Anand Sainath
6
C'est excellent. One gotcha - si l' textAllCapsattribut est défini sur true sur le TextView sous-jacent (par exemple via un thème), la police personnalisée n'apparaîtra pas. C'était un problème pour moi lorsque j'ai appliqué cette technique aux éléments de l'onglet de la barre d'actions.
James
4
Notez que cette implémentation de la classe suppose que vous placez vos fichiers de polices assets/fonts/. Si vous venez de jeter les .ttf / fichiers .otf à l'actif et non dans un sous - dossier, vous devez modifier la ligne suivante de code en conséquence: String.format("fonts/%s", typefaceName). J'ai perdu 10 bonnes minutes en essayant de comprendre. Si vous ne le faites pas, vous obtiendrezjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt
1
Au moment de démarrer l'application, le style de titre par défaut est visible et environ 1 seconde plus tard, le style personnalisé apparaît. Bad UI ...
Upvote
2
C'est une excellente réponse et m'a aidé une tonne. Une amélioration que j'ajouterais serait de déplacer le mécanisme de mise en cache dans sa propre classe en dehors de TypefaceSpan. Je suis tombé sur d'autres situations où j'utilisais une police de caractères sans étendue et cela m'a également permis de profiter du cache dans ces situations.
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);
Chiffre
la source
2
Ce devrait être la réponse préférée à la question. Fonctionne très bien, également avec "action_bar_subtitle"! Merci!
Zordid
20
si les développeurs Android dans une version plus récente changent l'ID de ressource de "action_bar_title" en un autre nom, alors rien de tout cela ne fonctionnera. c'est pourquoi ce n'est pas si voté.
Diogo Bento du
6
Fonctionne sur api> 3.0 mais pas dans 2.x pour appcompat
Aman Singhal
1
Cela change la police et tout. Mais quand je suis passé à la prochaine activité et que j'ai repoussé, la police est inversée. Je suppose que cela a quelque chose à voir avec les propriétés ActionBar.
Pranav Mahajan
11
@Digit: Cela fonctionnait très bien pour le "Holo Theme", mais pas pour le "Material Theme" (android L). Le titleId est trouvé, mais le textview est nul .. des idées comment résoudre ce problème? Merci!
Michael D.
34

À partir de la bibliothèque de support Android v26 + Android Studio 3.0 , ce processus est devenu facile comme un film !!

Suivez ces étapes pour modifier la police du titre de la barre d'outils:

  1. Lisez les polices téléchargeables et sélectionnez n'importe quelle police dans la liste ( ma recommandation ) ou chargez une police personnalisée res > fontselon les polices en XML
  2. Dans res > values > styles, collez ce qui suit ( utilisez votre imagination ici! )

    <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. Insérez une nouvelle ligne dans les propriétés app:titleTextAppearance="@style/TextAppearance.TabsFont"de votre barre d'outils comme indiqué ci-dessous

    <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. Profitez d'un style de police de titre Actionbar personnalisé !!

Mohammed Mukhtar
la source
2
C'est parfait pour les barres d'outils. Est-il possible de le faire à l'échelle de l'application, comme lorsque vous avez la barre d'application par défaut dans une nouvelle activité?
Jordan H
14

La bibliothèque de calligraphie vous permet de définir une police personnalisée via le thème de l'application, qui s'appliquerait également à la barre d'action.

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

Tout ce qu'il faut pour activer la calligraphie est de l'attacher à votre contexte d'activité:

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

L'attribut personnalisé par défaut est fontPath, mais vous pouvez fournir votre propre attribut personnalisé pour le chemin en l'initialisant dans votre classe Application avec CalligraphyConfig.Builder. L'utilisation de android:fontFamilya été déconseillée.

thoutbeckers
la source
API 16
minimale
minSdk 7 selon le fichier de construction du projet, mais je l'utilise dans un projet minSdk 18 et je n'ai pas vérifié davantage. Quelle est la méthode incriminée utilisée?
thubbeckers
Son API 7 min. Juste l'exemple est API16. il prend en charge appcompat-v7 +
Chris.Jenkins
11

C'est un vilain hack mais vous pouvez le faire comme ça (puisque action_bar_title est caché):

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

Ce code est destiné aux appareils post-GINGERBREAD, mais il peut facilement être étendu pour fonctionner avec la barre d'action Sherlock.

PS Sur la base du commentaire @pjv, il existe un meilleur moyen de trouver l'identifiant du titre de la barre d'action

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
Bostone
la source
4
Je préfère la réponse de dtmilano dans stackoverflow.com/questions/10779037/… . C'est similaire mais légèrement plus à l'épreuve du temps.
pjv
1
@pjv - d'accord. Semble moins "hacky". J'ai modifié ma réponse
Bostone
1
La question concerne donc la police personnalisée. Cela explique comment obtenir la vue texte de la barre d'actions par défaut .
AlikElzin-kilaka
@kilaka - l'idée était que si vous obtenez le réglage de l'affichage du texte, la police personnalisée serait triviale. C'est un vieil article cependant, je pense que la réponse de twaddington est de
loin
8

Le code suivant fonctionnera pour toutes les versions. J'ai vérifié cela dans un appareil avec du pain d'épice ainsi que sur un appareil 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);
        }
    }
Napoléon
la source
Cela fonctionne pour moi sur ActionBar et AppCompat ActionBar. Mais ce dernier ne fonctionne que si j'essaie de trouver la vue du titre après onCreate (), donc par exemple le placer sur onPostCreate () fait l'affaire.
Harri
8

utilisez la nouvelle barre d'outils dans la bibliothèque de support, concevez votre barre d'action comme la vôtre ou utilisez le code ci-dessous

Gonfler Textview n'est pas une bonne option, essayez le générateur de chaînes pouvant être étendues

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

copier sous la classe

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
la source
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
la source
Super Cela fonctionne parfaitement comment puis-je placer cette barre d'application au centre?
Prasath
fonctionnant comme un charme .. il suffit de remplacer typeface.ITALICpar Typeface.ITALICpour ne pas avoir d'avertissement de membre statique
Zain
3

Si vous souhaitez définir la police de caractères pour tous les TextViews de l'activité entière, vous pouvez utiliser quelque chose comme ceci:

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

Et le 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));
    }
}
user2136334
la source
3

Je viens de faire ce qui suit dans la fonction 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);

J'utilise les bibliothèques de support, si vous ne les utilisez pas, je suppose que vous devriez passer à getActionBar () au lieu de getSupportActionBar ().

Dans Android Studio 3, vous pouvez ajouter des polices personnalisées en suivant ces instructions https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html , puis utiliser la police que vous venez d'ajouter dans " font_to_be_used "

Sept
la source
1

Pour ajouter à la réponse de @ Sam_D, j'ai dû le faire pour que cela fonctionne:

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

Cela semble exagéré - référencer v.findViewById (R.id.title)) deux fois - mais c'est la seule façon pour moi de le faire.

IgorGanapolsky
la source
1

Pour mettre à jour la bonne réponse.

tout d'abord: définissez le titre sur false, car nous utilisons une vue personnalisée

    actionBar.setDisplayShowTitleEnabled(false);

deuxièmement: créer 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>

Enfin :

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

TÉLÉCHARGER LE FICHIER DE POLICE: parce que je stocke le fichier dans le cloudinaire, j'ai donc un lien dessus pour le télécharger.

/**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
la source
1

Aucune visualisation de texte personnalisée n'est requise!

Tout d'abord, désactivez le titre dans la barre d'outils de votre code java: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Ensuite, ajoutez simplement un TextView dans la barre d'outils:

<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
la source
cela ne fonctionnera pas avec les dernières bibliothèques de navigation jetpack UI
Ali Asheer
1

Essayez d'utiliser ceci

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
la source
0

Nous devons utiliser des réflexions pour y parvenir

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
la source
-1

ESSAYE ÇA

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);
}
user2212515
la source