Titel der Android-Symbolleiste und benutzerdefinierte Schriftart

366

Ich versuche herauszufinden, wie eine benutzerdefinierte Schriftart für den Symbolleisten-Titel richtig verwendet und in der Symbolleiste zentriert werden kann (Client-Anforderung).

Im Moment verwende ich die gute alte ActionBar und habe den Titel auf einen leeren Wert gesetzt und setCustomViewmeine benutzerdefinierte Schriftart TextView eingefügt und mit ActionBar.LayoutParams zentriert.

Gibt es einen besseren Weg, das zu tun? Verwenden der neuen Symbolleiste als meine Aktionsleiste.

Mathbl
quelle

Antworten:

718

Um einen benutzerdefinierten Titel in Ihrem zu verwenden Toolbar, müssen Sie sich nur daran erinnern, dass dies Toolbarnur eine ausgefallene ViewGroup ist, sodass Sie einen benutzerdefinierten Titel wie folgt hinzufügen können:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >


     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title" />


    </android.support.v7.widget.Toolbar>

Dies bedeutet, dass Sie das stylen können, TextViewwie Sie möchten, da es nur ein reguläres ist TextView. In Ihrer Aktivität können Sie also wie folgt auf den Titel zugreifen:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
MrEngineer13
quelle
5
Schlagen Sie vor, stattdessen Android: layout_width = "wrap_content" zu verwenden. android: layout_height = "wrap_content" android: layout_gravity = "center".
SteelBytes
194
Wenn jemand anderes den Standardtitel des App-Namens nicht entfernen kann, gehen Sie folgendermaßen vor: 1. Rufen Sie setSupportActionBar (yourToolbar) auf. 2. Rufen Sie getSupportActionBar () auf. SetDisplayShowTitleEnabled (false);
Rick Sanchez
75
Versuchen Sie Folgendes, um weiterhin Standardstile für die angepasste Textansicht zu verwenden style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"( siehe diese Antwort ).
Jonik
5
Hinzufügen von Android: paddingRight = "? attr / actionBarSize" kann helfen, den Text in der Mitte Ihres Bildschirms zu zentrieren, falls Sie eine Schaltfläche haben (Home, Navigationsschublade usw.)
Gordak
5
Was passiert, wenn sich in der Symbolleiste ein Hamburger-Symbol befindet? Es befindet sich nicht in der Mitte der gesamten Symbolleistenbreite, sondern in der Mitte von ToolbarWidth - HamburgerIconWidth .
Akshay
75

Der ToolBar-Titel ist stilisierbar. Alle Anpassungen, die Sie vornehmen, müssen im Thema vorgenommen werden. Ich gebe Ihnen ein Beispiel.

Symbolleistenlayout:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    style="@style/ToolBarStyle.Event"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="@dimen/abc_action_bar_default_height_material" />

Stile:

<style name="ToolBarStyle" parent="ToolBarStyle.Base"/>

<style name="ToolBarStyle.Base" parent="">
    <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

<style name="ToolBarStyle.Event" parent="ToolBarStyle">
    <item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item>
</style>

<style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
    <!--Any text styling can be done here-->
    <item name="android:textStyle">normal</item>
    <item name="android:textSize">@dimen/event_title_text_size</item>
</style>
Binoy Babu
quelle
59
Dies ist der richtige Weg. Das Hinzufügen eines weiteren TextViewist etwas hackig, aber die Antwort auf die Reflexion ist einfach nur böse.
DariusL
9
Sauber, aber Sie können keine benutzerdefinierte Schriftart aus dem Stil festlegen. Traurig.
Niqueco
20
Sie können auch die Ausrichtung des Titels nicht ändern.
Terry
7
@ user1560102 Das Hinzufügen einer Textansicht zur Symbolleiste ist nicht schwierig. Dafür wurde es entwickelt.
Tim Malseed
107
Dadurch wird der Text nicht zentriert.
Sebastian Roth
69

Dies ist nur, um alle Teile mit der Antwort von @ MrEngineer13 mit @ Jonik- und @ Rick Sanchez-Kommentaren in der richtigen Reihenfolge zu verbinden, damit der Titel leicht zentriert wird !!

Das Layout mit TextAppearance.AppCompat.Widget.ActionBar.Title:

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"                      
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            android:layout_gravity="center" />

    </android.support.v7.widget.Toolbar>

Der Weg mit der richtigen Reihenfolge zu erreichen:

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);

    setSupportActionBar(toolbar);
    mTitle.setText(toolbar.getTitle());

    getSupportActionBar().setDisplayShowTitleEnabled(false);

Bitte vergessen Sie nicht, @ MrEngineer13 zu bewerten !!!

Hier ist ein Beispielprojekt ToolbarCenterTitleSample

Geben Sie hier die Bildbeschreibung ein

Hoffe jemand anderem zu helfen;)

Gueorgui Obregon
quelle
5
wenn ich setDisplayHomeAsUpEnabled (true) und setDisplayShowHomeEnabled (true) setze; zurück Pfeil enalbe. Dann kommt der Titel nicht in die Mitte. Ich habe versucht, actionBar.setTitle ("") zu setzen; und setDisplayShowTitleEnabled (false). Aber immer noch nicht in der Lage, das Problem zu lösen
Prashanth Debbadwar
Bist du es für eine getestet Scrolling Activity?
AN
Es ist wahr, dass mit dem hinteren Pfeil der Titel nicht zentriert ist (er ist um die halbe Breite des hinteren Pfeils nach rechts versetzt). Ich nehme an, wenn ich wirklich entschlossen wäre, würde ich programmgesteuert genügend Rand rechts neben dem Textfeld hinzufügen, um den Text zu zentrieren.
Jemand irgendwo
52

Wir haben keinen direkten Zugriff auf den ToolBar-Titel TextView, daher verwenden wir Reflection, um darauf zuzugreifen.

  private TextView getActionBarTextView() {
    TextView titleTextView = null;

    try {
        Field f = mToolBar.getClass().getDeclaredField("mTitleTextView");
        f.setAccessible(true);
        titleTextView = (TextView) f.get(mToolBar);
    } catch (NoSuchFieldException e) {
    } catch (IllegalAccessException e) {
    }
    return titleTextView;
}
BugsBunnyBR
quelle
3
Obwohl dies hackig ist, funktioniert diese Lösung für mich, nachdem ich versucht habe, einen Weg zu finden, um Zugriff auf die Textansicht der Symbolleiste zu erhalten. Vielen Dank.
falc0nit3
1
Hat gut für den Titel funktioniert. Beim Versuch, mSubtitleTextView wie folgt abzurufen, kam es jedoch zu einer Ausnahme. Auslöser: java.lang.NullPointerException: Versuch, die virtuelle Methode 'void android.widget.TextView.setTypeface (android.graphics.Typeface)' für eine Nullobjektreferenz aufzurufen
Vinod
5
Hinweis: Sie können erst auf das Feld "mTitleTextView" zugreifen, nachdem Sie den Titel der Symbolleiste festgelegt haben! Das Feld wird bei seiner ersten Verwendung faul initialisiert.
Funcoder
2
Was ist, wenn Sie Ihren Code mit ProGuard verschleiern und mTitleTextViewwerden abcde12345?
VoghDev
1
@voghDev getDeclaredField löst in diesem Fall NoSuchFieldException aus, was dazu führt, dass der Code nicht funktioniert.
Jeremy
30

Hier ist ein Titeltext-abhängiger Ansatz, um eine TextViewInstanz zu finden Toolbar.

  public static TextView getToolbarTitleView(ActionBarActivity activity, Toolbar toolbar){
    ActionBar actionBar = activity.getSupportActionBar();
    CharSequence actionbarTitle = null;
    if(actionBar != null)
        actionbarTitle = actionBar.getTitle();
    actionbarTitle = TextUtils.isEmpty(actionbarTitle) ? toolbar.getTitle() : actionbarTitle;
    if(TextUtils.isEmpty(actionbarTitle)) return null;
    // can't find if title not set
    for(int i= 0; i < toolbar.getChildCount(); i++){
        View v = toolbar.getChildAt(i);
        if(v != null && v instanceof TextView){
            TextView t = (TextView) v;
            CharSequence title = t.getText();
            if(!TextUtils.isEmpty(title) && actionbarTitle.equals(title) && t.getId() == View.NO_ID){
                //Toolbar does not assign id to views with layout params SYSTEM, hence getId() == View.NO_ID
                //in same manner subtitle TextView can be obtained.
                return t;
            }
        }
    }
    return null;
}
Nikola Despotoski
quelle
28

Definieren Sie die folgende Klasse:

public class CenteredToolbar extends Toolbar {

    private TextView centeredTitleTextView;

    public CenteredToolbar(Context context) {
        super(context);
    }

    public CenteredToolbar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CenteredToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setTitle(@StringRes int resId) {
        String s = getResources().getString(resId);
        setTitle(s);
    }

    @Override
    public void setTitle(CharSequence title) {
        getCenteredTitleTextView().setText(title);
    }

    @Override
    public CharSequence getTitle() {
        return getCenteredTitleTextView().getText().toString();
    }

    public void setTypeface(Typeface font) {
        getCenteredTitleTextView().setTypeface(font);
    }

    private TextView getCenteredTitleTextView() {
        if (centeredTitleTextView == null) {
            centeredTitleTextView = new TextView(getContext());
            centeredTitleTextView.setTypeface(...);
            centeredTitleTextView.setSingleLine();
            centeredTitleTextView.setEllipsize(TextUtils.TruncateAt.END);
            centeredTitleTextView.setGravity(Gravity.CENTER);
            centeredTitleTextView.setTextAppearance(getContext(), R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);

            Toolbar.LayoutParams lp = new Toolbar.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            lp.gravity = Gravity.CENTER;
            centeredTitleTextView.setLayoutParams(lp);

            addView(centeredTitleTextView);
        }
        return centeredTitleTextView;
    }
}

... und dann benutze es einfach statt normal Toolbarwie folgt:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent">

        <your.packagename.here.CenteredToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            android:theme="?attr/actionBarTheme"
            app:title="@string/reset_password_page_title"/>

        <!-- Other views -->

</RelativeLayout>

Sie benötigen noch diese 2 Codezeilen in Ihrem Activity(wie beim Standard Toolbar):

Toolbar toolbar = (Toolbar) findViewByid(R.id.toolbar); // note that your activity doesn't need to know that it is actually a custom Toolbar
setSupportActionBar(binding.toolbar);

Das ist es! Sie müssen den linksbündigen Standardtitel nicht ausblenden, nicht immer wieder denselben XML-Code duplizieren usw. Verwenden CenteredToolbarSie ihn einfach so, als wäre er Standard Toolbar. Sie können Ihre benutzerdefinierte Schriftart auch programmgesteuert festlegen, da Sie jetzt direkten Zugriff auf die haben TextView. Hoffe das hilft.

fraggjkee
quelle
1
Vielen Dank! Die beste Lösung, nur nicht zu vergessen, das "v7.widget"
David
Ich weiß, dass dies ziemlich alt ist, aber ... wie kann ich die Textfarbe ändern? Ich habe es in XML mit der App: titleTextColor und im Code mit centerTitleTextView.setColor versucht. Irgendwelche Ideen, @fraggjkee?
Genaro Alberto Cancino Herrera
centeredTitleTextView.setTextColor(...)sollte funktionieren
fraggjkee
Sollte es nicht sein LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)?
Liminal
16

Niemand hat dies erwähnt, aber es gibt einige Attribute für Toolbar:

app:titleTextColor zum Einstellen der Titeltextfarbe

app:titleTextAppearance zum Einstellen der Titeltextdarstellung

app:titleMargin zum Einstellen des Randes

Und es gibt andere spezifische Seitenränder wie marginStartusw.

Ab ِ
quelle
1
Perfekte Lösung .. Wenn Sie FontOverride kennen , erstellen Sie einfach einen Stil in styles.xml <style name="customFontTextAppearanceStyle"> <item name="android:textSize">18sp</item> <item name="android:typeface">monospace</item> und wenden Sie ihn in der Symbolleiste an app:titleTextAppearance="@styles/customFontTextAppearanceStyle"
Chinmay Thoriya
2
Ich habe diese Methode verwendet, aber meiner Symbolleiste ist nichts passiert! Ich habe einen neuen '<Stil>' erstellt und ihn app:titleTextAppearanc="style name" auf dem android.support.v7.widget.ToolbarTAG
AN
12

Ich benutze diese Lösung:

static void centerToolbarTitle(@NonNull final Toolbar toolbar) {
    final CharSequence title = toolbar.getTitle();
    final ArrayList<View> outViews = new ArrayList<>(1);
    toolbar.findViewsWithText(outViews, title, View.FIND_VIEWS_WITH_TEXT);
    if (!outViews.isEmpty()) {
        final TextView titleView = (TextView) outViews.get(0);
        titleView.setGravity(Gravity.CENTER);
        final Toolbar.LayoutParams layoutParams = (Toolbar.LayoutParams) titleView.getLayoutParams();
        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        toolbar.requestLayout();
        //also you can use titleView for changing font: titleView.setTypeface(Typeface);
    }
}
Ultraon
quelle
1
Funktioniert sehr gut, wird jedoch aus irgendeinem Grund bei Symbolleisten ohne Elementschaltfläche nicht richtig zentriert.
Munib
1
Ein Zusatz: Wenn Sie ein Navdrawer- oder Back-Symbol in der Symbolleiste haben, bleibt der Titel nicht genau in der Mitte. Ich füge ein leeres Einstellungsmenüsymbol für diese Situation hinzu. Mein leerer Menüpunkt ist: <item android: id = "@ + id / leer" android: orderInCategory = "100" android: icon = "@ android: color / transparent" app: showAsAction = "immer" tools: ignore = " MenuTitle "/>
Mete
10

Ohne die Symbolleiste TextView können wir die Schriftart mithilfe des folgenden Codes anpassen

getSupportActionBar().setDisplayShowTitleEnabled(false);
or
getActionBar().setDisplayShowTitleEnabled(false);

public void updateActionbar(String title){
    SpannableString spannableString = new SpannableString(title);
    spannableString.setSpan(new TypefaceSpanString(this,  "futurastdmedium.ttf"),
            0, spannableString.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    mToolbar.setTitle(spannableString);
}
Ajit Kumar Dubey
quelle
1
Wenn Sie nur die Schriftart ändern müssen, scheint dies die sauberste Lösung zu sein. HINWEIS: TypefaceSpanString ist genau das: stackoverflow.com/a/17961854
Mohib Irshad
8
    public class TestActivity extends AppCompatActivity {
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_test);

        toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
        setSupportActionBar(toolbar);

        customizeToolbar(toolbar);
    }

    public void customizeToolbar(Toolbar toolbar){
        // Save current title and subtitle
        final CharSequence originalTitle = toolbar.getTitle();
        final CharSequence originalSubtitle = toolbar.getSubtitle();

        // Temporarily modify title and subtitle to help detecting each
        toolbar.setTitle("title");
        toolbar.setSubtitle("subtitle");

        for(int i = 0; i < toolbar.getChildCount(); i++){
            View view = toolbar.getChildAt(i);

            if(view instanceof TextView){
                TextView textView = (TextView) view;


                if(textView.getText().equals("title")){
                    // Customize title's TextView
                    Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
                    params.gravity = Gravity.CENTER_HORIZONTAL;
                    textView.setLayoutParams(params);

                    // Apply custom font using the Calligraphy library
                    Typeface typeface = TypefaceUtils.load(getAssets(), "fonts/myfont-1.otf");
                    textView.setTypeface(typeface);

                } else if(textView.getText().equals("subtitle")){
                    // Customize subtitle's TextView
                    Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
                    params.gravity = Gravity.CENTER_HORIZONTAL;
                    textView.setLayoutParams(params);

                    // Apply custom font using the Calligraphy library
                    Typeface typeface = TypefaceUtils.load(getAssets(), "fonts/myfont-2.otf");
                    textView.setTypeface(typeface);
                }
            }
        }

        // Restore title and subtitle
        toolbar.setTitle(originalTitle);
        toolbar.setSubtitle(originalSubtitle);
    }
}
Shatazon
quelle
1
Die Lösung funktioniert hervorragend, wenn Sie die letzten beiden Codezeilen ausgeben. Sie sollte sich nicht in der for-Schleife befinden: // Titel und Untertitel wiederherstellen toolbar.setTitle (originalTitle); toolbar.setSubtitle (originalSubtitle);
Ivan Stojkovic
5

Layout:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

     <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:layout_gravity="center"
        android:gravity="center"
        android:id="@+id/toolbar_title" />
</android.support.v7.widget.Toolbar>

Code:

    Toolbar mToolbar = parent.findViewById(R.id.toolbar_top);
    TextView mToolbarCustomTitle = parent.findViewById(R.id.toolbar_title);

    //setup width of custom title to match in parent toolbar
    mToolbar.postDelayed(new Runnable()
    {
        @Override
        public void run ()
        {
            int maxWidth = mToolbar.getWidth();
            int titleWidth = mToolbarCustomTitle.getWidth();
            int iconWidth = maxWidth - titleWidth;

            if (iconWidth > 0)
            {
                //icons (drawer, menu) are on left and right side
                int width = maxWidth - iconWidth * 2;
                mToolbarCustomTitle.setMinimumWidth(width);
                mToolbarCustomTitle.getLayoutParams().width = width;
            }
        }
    }, 0);
maros136
quelle
1
Ich denke, "int width = maxWidth - titleWidth * 2;" sollte "int width = maxWidth - iconWidth * 2;" sein, denkt!
Oldfeel
4

Ich habe diese Lösung gelöst, und dies ist ein folgender Code:

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Order History"
            android:layout_gravity="center"
            android:id="@+id/toolbar_title"
            android:textSize="17sp"
            android:textStyle="bold"
            android:textColor="@color/colorWhite"
            />

    </android.support.v7.widget.Toolbar>

Und Sie können Titel / Bezeichnung ändern. Schreiben Sie in Aktivität einen der folgenden Codes:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);

TextView mTitle = (TextView) toolbarTop.findViewById (R.id.toolbar_title); mTitle.setText ("@ string / ....");

Hai Rom
quelle
4

Sie können wie folgt verwenden

 <android.support.v7.widget.Toolbar
    android:id="@+id/top_actionbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppThemeToolbar">

    <TextView
        android:id="@+id/pageTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />
</android.support.v7.widget.Toolbar>
Ein Sharma
quelle
wenn ich setDisplayHomeAsUpEnabled (true) und setDisplayShowHomeEnabled (true) setze; zurück Pfeil enalbe. Dann kommt der Titel nicht in die Mitte. Ich habe versucht, actionBar.setTitle ("") zu setzen; und setDisplayShowTitleEnabled (false). Aber immer noch nicht in der Lage, das Problem zu lösen
Prashanth Debbadwar
4

Eine sehr schnelle und einfache Möglichkeit, eine benutzerdefinierte Schriftart festzulegen, ist die Verwendung einer benutzerdefinierten SchriftarttitleTextAppearance mit fontFamily:

Zu styles.xml hinzufügen :

<style name="ToolbarTitle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">#FF202230</item>
    <item name="android:fontFamily">@font/varela_round_regular</item>
</style>

Erstellen Sie in Ihrem res- Ordner eine Schriftart (Beispiel: varela_round_regular.ttf )

Weitere Informationen finden Sie im offiziellen Handbuch unter https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

vovahost
quelle
3

Ich weiß nicht, ob sich in der Appcompat-Bibliothek etwas geändert hat, aber es ist ziemlich trivial, es ist kein Nachdenken erforderlich.

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// loop through all toolbar children right after setting support 
// action bar because the text view has no id assigned

// also make sure that the activity has some title here
// because calling setText() with an empty string actually
// removes the text view from the toolbar

TextView toolbarTitle = null;
for (int i = 0; i < toolbar.getChildCount(); ++i) {
    View child = toolbar.getChildAt(i);

    // assuming that the title is the first instance of TextView
    // you can also check if the title string matches
    if (child instanceof TextView) {
        toolbarTitle = (TextView)child;
        break;
    }
}
Headsvk
quelle
3

Lösung, die ich für dieses Problem verwendet habe:

 public static void applyFontForToolbarTitle(Activity a){
        Toolbar toolbar = (Toolbar) a.findViewById(R.id.app_bar);
        for(int i = 0; i < toolbar.getChildCount(); i++){
            View view = toolbar.getChildAt(i);
            if(view instanceof TextView){
                TextView tv = (TextView) view;
                if(tv.getText().equals(a.getTitle())){
                    tv.setTypeface(getRuneTypefaceBold(a));
                    break;
                }
            }
        }
    }

Für den Schwerpunkt denke ich, dass es notwendig wäre, die Layoutparameter horizontal in match_parent zu ändern und dann:

tv.setGravity(Gravity.CENTER);
Monet_z_Polski
quelle
3

Update von der Antwort von @ MrEngineer13: Um das Titelzentrum in jedem Fall auszurichten, einschließlich des Hamburger-Symbols und der Optionsmenüs, können Sie eine FrameLayoutSymbolleiste wie die folgende hinzufügen :

   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

         <FrameLayout android:layout_width="match_parent"
                    android:layout_height="match_parent">

              <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="Toolbar Title"
               android:layout_gravity="center"
               style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
               android:id="@+id/toolbar_title" />

        </FrameLayout>

   </android.support.v7.widget.Toolbar>
R4j
quelle
3

Versuchen Sie in XML Folgendes:

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="@color/action_bar_bkgnd"
app:theme="@style/ToolBarTheme" >


 <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Toolbar Title"
    android:layout_gravity="center"
    android:id="@+id/toolbar_title" />


</android.support.v7.widget.Toolbar>

In Code:

Toolbar myToolbar= (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) mytoolbar.findViewById(R.id.toolbar_title);
mohamad sheikhi
quelle
2

Obwohl das Hinzufügen einer Textansicht zur Symbolleiste das Problem der Einschränkung des Titelstils lösen kann, gibt es ein Problem damit. Da wir es keinem Layout hinzufügen, haben wir nicht zu viel Kontrolle über seine Breite. Wir können entweder wrap_content oder match_parent verwenden.

Stellen Sie sich nun ein Szenario vor, in dem eine Suchansicht als Schaltfläche am rechten Rand der Symbolleiste angezeigt wird. Wenn der Titelinhalt mehr ist, wird er über der Schaltfläche angezeigt, wodurch er verdeckt wird. Es gibt keine Möglichkeit, diesen Kurzschluss beim Festlegen einer Breite für das Etikett zu steuern, und Sie möchten dies nicht tun, wenn Sie ein ansprechendes Design wünschen.

Hier ist eine Lösung, die für mich funktioniert hat und sich geringfügig vom Hinzufügen einer Textansicht zur Symbolleiste unterscheidet. Fügen Sie stattdessen die Symbolleiste und die Textansicht zu einem relativen Layout hinzu und stellen Sie sicher, dass sich die Textansicht oben auf der Symbolleiste befindet. Dann können wir geeignete Ränder verwenden und sicherstellen, dass die Textansicht dort angezeigt wird, wo sie angezeigt werden soll.

Stellen Sie sicher, dass Sie die Symbolleiste so einstellen, dass der Titel nicht angezeigt wird.

Hier ist das XML für diese Lösung:

<RelativeLayout
                    android:orientation="horizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="?attr/colorPrimary">

                    <android.support.v7.widget.Toolbar
                        android:theme="@style/ThemeOverlay.AppCompat.Dark"
                        android:id="@+id/activity_toolbar"
                        android:layout_width="match_parent"
                        android:layout_height="?attr/actionBarSize"
                        android:background="?attr/colorPrimary"
                        android:titleTextAppearance="@style/AppTheme.TitleTextView"
                        android:layout_marginRight="40dp"
                        android:layoutMode="clipBounds">

                        <android.support.v7.widget.SearchView
                            android:id="@+id/search_view"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="right"
                            android:layout_centerVertical="true"
                            android:layout_alignParentRight="true"
                            android:foregroundTint="@color/white" />
                        </android.support.v7.widget.Toolbar>

                    <TextView
                        android:id="@+id/toolbar_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginRight="90dp"
                        android:text="@string/app_name"
                        android:textSize="@dimen/title_text_size"
                        android:textColor="@color/white"
                        android:lines="1"
                        android:layout_marginLeft="72dp"
                        android:layout_centerVertical="true" />

                </RelativeLayout>

Behebt das oben erwähnte Problem @ ankur-chaudhary.

Deepak GM
quelle
2

Da android.support.v7.appcompat 24.2 Toolbarhat Methode setTitleTextAppearanceund Sie können seine Schriftart ohne externe einstellen textview.

Erstellen Sie einen neuen Stil in styles.xml

<style name="RobotoBoldTextAppearance">
        <item name="android:fontFamily">@font/roboto_condensed_bold</item>
</style>

und benutze es

mToolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);
Regenmacher
quelle
2

Ich habe mehrere Tage nach einer universellen Lösung gesucht. Meine Symbolleiste arbeitet mit Android-Menü und Navigationssymbol.

Zunächst müssen Sie eine benutzerdefinierte Symbolleistenklasse erstellen. Diese Klasse muss titelzentrierte Positionen (Auffüllungen) berechnen:

    class CenteredToolbar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
    : Toolbar(context, attrs, defStyleAttr) {

    init {
        addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
            override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {
                val titleTextView = findViewById<TextView>(R.id.centerTitle)

                val x = titleTextView.x.toInt()
                val x2 = x + titleTextView.width

                val fullWidth = width
                val fullCenter = fullWidth / 2

                val offsetLeft = Math.abs(fullCenter - x)
                val offsetRight = Math.abs(x2 - fullCenter)
                val differOffset = Math.abs(offsetLeft - offsetRight)

                if (offsetLeft > offsetRight) {
                    titleTextView.setPadding(differOffset, 0, 0, 0)
                } else if (offsetRight > offsetLeft) {
                    titleTextView.setPadding(0, 0, differOffset, 0)
                }

                removeOnLayoutChangeListener(this)
            }
        })
    }

    override fun setTitle(resId: Int) = getTitleView().setText(resId)

    override fun setTitle(title: CharSequence?) = getTitleView().setText(title)

    fun getTitleView(): TextView = findViewById(R.id.centerTitle)

}

Zweitens müssen Sie eine Layout-Symbolleiste erstellen:

<CenteredToolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar">

    <TextView
        android:id="@+id/centerTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</CenteredToolbar>

Das ist alles

Valery Boretsky
quelle
2

Versuchen Sie, Symbolleiste und Tittle in einer separaten Ansicht zu verwenden. Sehen Sie sich das rechte Ende an und geben Sie ihnen ein Gewicht, das dem Gewicht der Symbolleiste entspricht. Auf diese Weise kommt Ihr Tittle in die Mitte.

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:background="@color/white_color">
  <LinearLayout
   android:id="@+id/toolbar_layout"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@color/white_color">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/white_color"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        android:layout_weight="0.2"

        app:contentInsetStartWithNavigation="0dp"
        app:navigationIcon="@color/greyTextColor">
       </android.support.v7.widget.Toolbar>


        <com.an.customfontview.CustomTextView
            android:id="@+id/headingText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.6"
            android:gravity="center"
            android:text="Heading"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:textColor="@color/colorPrimary"
            android:textSize="@dimen/keyboard_number"
            android:layout_gravity="center_horizontal|center_vertical"
            app:textFontPath="fonts/regular.ttf" />
            <ImageView
                android:id="@+id/search_icon"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:visibility="visible"
                android:layout_weight="0.2"
                android:layout_gravity="center_horizontal|center_vertical"
                android:src="@drawable/portfolio_icon"/>
        </LinearLayout>

       </android.support.design.widget.AppBarLayout>
Diya Bhat
quelle
2

Sie können diesen Code in Ihre XML-Datei einfügen

 <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryDark"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:textColor="#000000"
        android:textSize="20dp"
        android:id="@+id/toolbar_title" />

</androidx.appcompat.widget.Toolbar>
Uzair Ahmed
quelle
Hallo Uzair. Welche XML-Datei? Ich verwende ein Android Studio 3.6.3-Projekt, das aus einer Vorlage für leere Aktivitäten erstellt wurde. Vielen Dank.
Liebe und Frieden - Joe Codeswell
1
private void makeTitleCenter(String title, Toolbar toolbar) {
    if (title != null && !TextUtils.isEmpty(title.trim())) {
        final String tag = " ";
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle(tag);
        }
        TextView titleTv = null;
        View leftBtn = null;
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            View view = toolbar.getChildAt(i);
            CharSequence text = null;
            if (view instanceof TextView && (text = ((TextView) view).getText()) != null && text.equals(tag)) {
                titleTv = (TextView) view;
            } else if (view instanceof ImageButton) {
                leftBtn = view;
            }
        }
        if (titleTv != null) {
            final TextView fTitleTv = titleTv;
            final View fLeftBtn = leftBtn;
            fTitleTv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    fTitleTv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    int leftWidgetWidth = fLeftBtn != null ? fLeftBtn.getWidth() : 0;
                    fTitleTv.setPadding(DimenUtil.getResources().getDisplayMetrics().widthPixels / 2 - leftWidgetWidth - fTitleTv.getWidth() / 2, 0, 0, 0);
                    fTitleTv.requestLayout();
                }
            });
        }
    }
}
wklbeta
quelle
1

Die Einstellung android:gravity="center"hat bei mir funktioniert

Kein Styling nichts. Die Symbolleiste ist im Grunde ViewGroupalles, was Sie tun müssen, ist die Schwerkraft der darin enthaltenen Elemente einzustellen.

        <android.support.v7.widget.Toolbar
            android:id="@+id/htab_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:layout_gravity="top"
            android:background="@color/partial_transparent"
            android:gravity="center"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Hitesh Sahu
quelle
8
Funktioniert nicht mitandroidx.appcompat.widget.Toolbar
tmm1
1

Für benutzerdefinierte Schriftarten in der Symbolleiste können Sie die TextView-Schriftart im Stil überschreiben und dann jede TextView in Ihrer App auch die Titelschrift der Symbolleiste automatisch ändern. Ich habe sie in Android Studio 3.1.3 getestet

mit Stil mach es:

<style name="defaultTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">@font/your_custom_font</item>
</style>

und dann in Ihrem Thema Folgendes verwenden:

<item name="android:textViewStyle">@style/defaultTextViewStyle</item>
Ali Khaki
quelle
1

Ich habe eine andere Möglichkeit gefunden, eine benutzerdefinierte Symbolleiste ohne zusätzlichen Java / Kotlin-Code hinzuzufügen.

  • Erstens: Erstellen Sie ein XML mit Ihrem benutzerdefinierten Symbolleistenlayout mit AppBarLayout als übergeordnetem Element:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.AppBarLayout                     
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay">
    
        <ImageView
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginEnd="@dimen/magin_default"
            android:src="@drawable/logo" />
    
    </android.support.v7.widget.Toolbar>

  • Zweitens: Fügen Sie die Symbolleiste in Ihr Layout ein:

    <?xml version="1.0" encoding="utf-8"?>                
    <android.support.constraint.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/blue"
        tools:context=".app.MainAcitivity"
        tools:layout_editor_absoluteY="81dp">
    
        <include
            layout="@layout/toolbar_inicio"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <!-- Put your layout here -->
    
    </android.support.constraint.ConstraintLayout>
Engelo Polotto
quelle
1

Aus meiner Sicht haben Sie zwei Möglichkeiten:

1) Bearbeiten Sie die XML-Symbolleiste. Wenn Ihre Symbolleiste in XML hinzugefügt wird, sieht es normalerweise so aus:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:elevation="4dp"
    app:popupTheme="@style/AppTheme.PopupOverlay"/>

Wenn Sie es anpassen möchten, entfernen Sie einfach das '/' am Ende und machen Sie es so:

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:elevation="4dp"
            app:popupTheme="@style/AppTheme.PopupOverlay">

            <android.support.constraint.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <ImageView
                    android:id="@+id/toolbar_iv"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:src="@mipmap/ic_launcher"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

                <TextView
                    android:id="@+id/toolbar_tv"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="20dp"
                    android:gravity="center"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toRightOf="@+id/toolbar_iv"
                    app:layout_constraintTop_toTopOf="parent" />

            </android.support.constraint.ConstraintLayout>
        </android.support.v7.widget.Toolbar>

Auf diese Weise können Sie eine Symbolleiste erstellen und die Textansicht und das Logo anpassen.

2) Ändern Sie programmgesteuert die native Textansicht und das Symbol:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setIcon(R.drawable.ic_question_mark);
getSupportActionBar().setTitle("Title");

Stellen Sie sicher, dass Ihre Symbolleiste nicht null ist, bevor Sie etwas darin festlegen.

Idan Damri
quelle
1

Sie können eine benutzerdefinierte TextViewin der Symbolleiste wie folgt haben:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title" />


</android.support.v7.widget.Toolbar>

Dadurch wird der Text zentriert. Wenn Sie benutzerdefinierte Schriftart zu einem normalen hinzufügen möchten Toolbar, stellen Sie ein <style>:

<style android:name="ToolbarFont">
    <item android:fontFamily = "@font/fontName" />
</style>

Und fügen Sie es der Symbolleiste hinzu:

toolbar.setTitleTextAppearance(this, R.style.ToolbarFont);

Für die Textansicht in der Symbolleiste können Sie sie mit dem fontFamilyAttribut definieren:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title"
        android:fontFamily="@font/fontFamily" />


</android.support.v7.widget.Toolbar>
Gourav
quelle
1

Ich hatte das gleiche Problem, das dadurch in MainActivity behoben wurde

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

Und in Fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (view == null) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_example, container, false);
        init();
    }
    getActivity().setTitle("Choose Fragment");
    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.example_menu, menu);
}
VINAY DANARADDI
quelle