Wie lege ich eine benutzerdefinierte Schriftart im ActionBar-Titel fest?

257

Wie (wenn möglich) kann ich eine benutzerdefinierte Schriftart in einem ActionBar-Titeltext (nur - nicht im Tabulatortext) mit einer Schriftart in meinem Assets-Ordner festlegen? Ich möchte die Option android: logo nicht verwenden.

vidstige
quelle

Antworten:

211

Ich bin damit einverstanden, dass dies nicht vollständig unterstützt wird, aber hier ist, was ich getan habe. Sie können eine benutzerdefinierte Ansicht für Ihre Aktionsleiste verwenden (diese wird zwischen Ihrem Symbol und Ihren Aktionselementen angezeigt). Ich verwende eine benutzerdefinierte Ansicht und habe den nativen Titel deaktiviert. Alle meine Aktivitäten erben von einer einzelnen Aktivität, die diesen Code in onCreate enthält:

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

Und meine Layout-XML (R.layout.titleview im obigen Code) sieht folgendermaßen aus:

<?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
quelle
1
Dies funktioniert gut für den Titel, aber wenn Sie einen Titel und Registerkarten möchten, wird die benutzerdefinierte Ansicht rechts von den Registerkarten platziert, nicht wie der Titel. Ich würde gerne den eigentlichen Titel ändern können.
Draksia
2
Tolle Lösung. Wenn Sie eine benutzerdefinierte Textansichtsklasse benötigen, die die Angabe der Schriftart in XML ermöglicht, versuchen Sie es bitte mit meiner! github.com/tom-dignan/nifty - es ist sehr einfach.
Thomas Dignan
Muss dieser Code in onCreate () enthalten sein? Ich muss es dynamisch außerhalb meiner Aktivität
einstellen
Sie müssen die Schriftart dynamisch ändern? oder möchten Sie nur den Titel ändern, sobald die Schriftart bereits angepasst wurde?
Sam Dozor
2
Das funktioniert, aber es ist viel zu viel Arbeit. Plus: Sie verlieren einige Funktionen des Standardtitels, z. B. das Hervorheben, wenn auf das Symbol geklickt wird ... Benutzerdefinierte Titel sind nicht dazu gedacht, das Standardtitellayout neu zu erstellen, nur um die Schriftarten zu ändern ...
Zordid
422

Sie können dies mit einer benutzerdefinierten TypefaceSpanKlasse tun . Es ist dem customViewoben angegebenen Ansatz überlegen, da es bei Verwendung anderer Aktionsleistenelemente wie dem Erweitern von Aktionsansichten nicht unterbrochen wird.

Die Verwendung einer solchen Klasse würde ungefähr so ​​aussehen:

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

Der benutzerdefinierten TypefaceSpanKlasse werden Ihr Aktivitätskontext und der Name einer Schriftart in Ihrem assets/fontsVerzeichnis übergeben. Es lädt die Datei und speichert eine neue TypefaceInstanz im Speicher. Die vollständige Implementierung von TypefaceSpanist überraschend einfach:

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

Kopieren Sie einfach die obige Klasse in Ihr Projekt und implementieren Sie sie onCreatewie oben gezeigt in die Methode Ihrer Aktivität .

Twaddington
quelle
20
Gute Antwort. Was gut zu sehen ist, ist, dass Sie auch eine Möglichkeit gezeigt haben, das Schriftelement zu zwischenspeichern.
Anand Sainath
6
Das ist ausgezeichnet. Ein Problem: Wenn das textAllCapsAttribut in der zugrunde liegenden Textansicht auf true gesetzt ist (z. B. über ein Thema), wird die benutzerdefinierte Schriftart nicht angezeigt. Dies war ein Problem für mich, als ich diese Technik auf die Registerkartenelemente der Aktionsleiste anwendete.
James
4
Beachten Sie, dass diese Implementierung der Klasse davon ausgeht, dass Sie Ihre Schriftdateien einfügen assets/fonts/. Wenn Sie die .ttf / .otf-Dateien nur unter Assets und nicht in einem Unterordner ablegen, sollten Sie die folgende Codezeile entsprechend ändern : String.format("fonts/%s", typefaceName). Ich habe gute 10 Minuten verloren, um es herauszufinden. Wenn Sie dies nicht tun, werden Sie bekommenjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt
1
Beim Starten der App wird der Standardtitelstil angezeigt und ca. 1 Sekunde später wird der benutzerdefinierte Stil angezeigt. Schlechte Benutzeroberfläche ...
Upvote
2
Dies ist eine großartige Antwort und hat mir eine Menge geholfen. Eine Verbesserung, die ich hinzufügen würde, wäre, den Caching-Mechanismus in eine eigene Klasse außerhalb von TypefaceSpan zu verschieben. Ich bin auf andere Situationen gestoßen, in denen ich eine Schrift ohne Zeitspanne verwendet habe, und dies hat mir ermöglicht, den Cache auch in diesen Situationen zu nutzen.
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);
Ziffer
quelle
2
Dies sollte die bevorzugte Antwort auf die Frage sein. Funktioniert auch mit "action_bar_subtitle"! Vielen Dank!
Zordid
20
Wenn die Android-Entwickler in einer neueren Version die Ressourcen-ID von "action_bar_title" in einen anderen Namen ändern, funktioniert nichts davon. deshalb ist es nicht so hoch gewählt.
Diogo Bento
6
Funktioniert auf API> 3.0, aber nicht in 2.x für Appcompat
Aman Singhal
1
Dies ändert die Schriftart und alles. Aber wenn ich zur nächsten Aktivität gehe und zurückdrücke, wird die Schrift zurückgesetzt. Ich denke, es hat etwas mit den ActionBar-Eigenschaften zu tun.
Pranav Mahajan
11
@Digit: Das hat beim "Holo Theme" super geklappt, beim "Material Theme" (android L) nicht. Die titleId wurde gefunden, aber die Textansicht ist null. Irgendwelche Ideen, wie man das behebt? Vielen Dank!
Michael D.
34

Aus der Android Support Library v26 + Android Studio 3.0 ist dieser Vorgang im einfach geworden !!

Führen Sie die folgenden Schritte aus, um die Schriftart des Symbolleisten-Titels zu ändern:

  1. Lesen Sie herunterladbare Schriftarten und wählen Sie eine beliebige Schriftart aus der Liste aus ( meine Empfehlung ) oder laden Sie eine benutzerdefinierte Schriftart res > fontgemäß Schriftarten in XML
  2. In res > values > stylesFügen Sie die folgende ( nutzen Sie Ihre Fantasie hier! )

    <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. Fügen Sie eine neue Zeile in Ihre Symbolleisteneigenschaften ein, app:titleTextAppearance="@style/TextAppearance.TabsFont"wie unten gezeigt

    <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. Viel Spaß beim Stylen von benutzerdefinierten Actionbar-Titeln !!

Mohammed Mukhtar
quelle
2
Dies ist ideal für Symbolleisten. Gibt es eine Möglichkeit, dies app-weit zu tun, beispielsweise wenn Sie die Standard-App-Leiste in einer neuen Aktivität haben?
Jordan H
14

In der Kalligraphiebibliothek können Sie über das App-Thema eine benutzerdefinierte Schriftart festlegen, die auch für die Aktionsleiste gilt.

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

Um die Kalligraphie zu aktivieren, müssen Sie sie lediglich an Ihren Aktivitätskontext anhängen:

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

Das benutzerdefinierte Standardattribut ist fontPath, Sie können jedoch Ihr eigenes benutzerdefiniertes Attribut für den Pfad bereitstellen, indem Sie es in Ihrer Anwendungsklasse mit initialisieren CalligraphyConfig.Builder. Von der Verwendung android:fontFamilywurde abgeraten.

thoutbeckers
quelle
Min API 16 für diese Lösung
Sami Eltamawy
minSdk 7 gemäß der Build-Datei des Projekts, aber ich verwende dies in einem minSdk 18-Projekt und habe dies nicht weiter überprüft. Was ist die beleidigende Methode?
Thoutbecker
Seine minimale API 7. Nur das Beispiel ist API16. es unterstützt appcompat-v7 +
Chris.Jenkins
11

Es ist ein hässlicher Hack, aber Sie können es so machen (da action_bar_title versteckt ist):

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

Dieser Code ist für Post-GINGERBREAD-Geräte vorgesehen, kann jedoch problemlos erweitert werden, um auch mit der Aktionsleiste Sherlock zu arbeiten

PS Basierend auf dem @ pjv-Kommentar gibt es eine bessere Möglichkeit, die Titel-ID der Aktionsleiste zu finden

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
Bostone
quelle
4
Ich bevorzuge die Antwort von dtmilano in stackoverflow.com/questions/10779037/… . Es ist ähnlich, aber etwas zukunftssicherer.
pjv
1
@pjv - vereinbart. Scheint weniger "hacky". Ich habe meine Antwort geändert
Bostone
1
Die Frage bezieht sich also auf benutzerdefinierte Schriftarten. Hier erfahren Sie, wie Sie die Textansicht der Standardaktionsleiste abrufen .
AlikElzin-Kilaka
@kilaka - die Idee war, dass die benutzerdefinierte Schriftart trivial wäre, wenn Sie die Einstellung für die Textansicht erhalten würden. Dies ist ein alter Beitrag, ich denke, Twaddington Antwort ist sehr bevorzugt
Bostone
8

Der folgende Code funktioniert für alle Versionen. Ich habe dies in einem Gerät mit Lebkuchen sowie auf einem JellyBean-Gerät überprüft

 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
quelle
Dies funktioniert für mich sowohl in der ActionBar als auch in der AppCompat ActionBar. Letzteres funktioniert jedoch nur, wenn ich versuche, die Titelansicht nach onCreate () zu finden. Wenn Sie sie beispielsweise in onPostCreate () platzieren, reicht dies aus.
Harri
8

Verwenden Sie eine neue Symbolleiste in der Support-Bibliothek. Entwerfen Sie Ihre Aktionsleiste als Ihre eigene oder verwenden Sie den folgenden Code

Das Aufblasen von Textview ist keine gute Option. Versuchen Sie es mit dem Spannable String Builder

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

Kopie unter Klasse

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
quelle
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
quelle
Großartig Das funktioniert perfekt Wie kann ich diese App-Leiste in die Mitte bringen?
Prasath
wie ein Zauber funktioniert .. nur ersetzen typeface.ITALICmit Typeface.ITALICkeine statische Mitglied Warnung haben
Zain
3

Wenn Sie die Schriftart auf alle Textansichten in der gesamten Aktivität festlegen möchten, können Sie Folgendes verwenden:

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

Und der 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
quelle
3

Ich habe gerade Folgendes in der Funktion onCreate () getan:

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

Ich verwende die Support-Bibliotheken. Wenn Sie sie nicht verwenden, sollten Sie zu getActionBar () anstelle von getSupportActionBar () wechseln.

In Android Studio 3 können Sie benutzerdefinierte Schriftarten gemäß den Anweisungen https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html hinzufügen und dann Ihre neu hinzugefügte Schriftart in " font_to_be_used "

Sieben
quelle
1

Um die Antwort von @ Sam_D zu ergänzen, musste ich Folgendes tun, damit es funktioniert:

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

Es scheint ein Overkill zu sein - zweimal auf v.findViewById (R.id.title)) zu verweisen - aber nur so kann ich es tun.

IgorGanapolsky
quelle
1

Um die richtige Antwort zu aktualisieren.

Erstens: Setzen Sie den Titel auf false, da wir die benutzerdefinierte Ansicht verwenden

    actionBar.setDisplayShowTitleEnabled(false);

Zweitens: Erstellen Sie 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>

Zuletzt :

//font file must be in the phone db so you have to create download file code
//check the code on the bottom part of the download file code.

   TypeFace font = Typeface.createFromFile("/storage/emulated/0/Android/data/"   
    + BuildConfig.APPLICATION_ID + "/files/" + "font name" + ".ttf");

    if(font != null) {
        LayoutInflater inflator = LayoutInflater.from(this);
        View v = inflator.inflate(R.layout.titleview, null);
        TextView titleTv = ((TextView) v.findViewById(R.id.title));
        titleTv.setText(title);
        titleTv.setTypeface(font);
        actionBar.setCustomView(v);
    } else {
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle("  " + title); // Need to add a title
    }

FONT-DATEI HERUNTERLADEN: Da ich die Datei in Cloudinary speichere, habe ich einen Link zum Herunterladen.

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

Es ist keine benutzerdefinierte Textansicht erforderlich!

Deaktivieren Sie zunächst den Titel in der Toobar in Ihrem Java-Code: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Fügen Sie dann einfach eine Textansicht in die Symbolleiste ein:

<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
quelle
Dies funktioniert nicht mit den neuesten Navigations-UI-Jetpack-Bibliotheken
Ali Asheer
1

Versuchen Sie es mit This

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

Wir müssen Reflexionen verwenden, um dies zu erreichen

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

VERSUCHE DIES

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
quelle