422 Stimmen

Android-Symbolleiste Titel und benutzerdefinierter Schriftart zentrieren

Ich versuche herauszufinden, wie man eine benutzerdefinierte Schriftart für den Symbolleistentitel verwendet und diesen in der Symbolleiste zentriert (Kundenanforderung).

Im Moment verwende ich die gute alte ActionBar und setze den Titel auf einen leeren Wert. Dann verwende ich setCustomView, um meine benutzerdefinierte Schriftart in einem TextView zu platzieren und sie mit ActionBar.LayoutParams zu zentrieren.

Gibt es einen besseren Weg, das zu tun? Verwendung der neuen Toolbar als meine ActionBar.

3voto

ductran Punkte 9878

Aktualisierung von @MrEngineer13's Antwort: Um den Titel in der Mitte auszurichten, einschließlich des Hamburger-Icons, der Optionsmenüs, können Sie ein FrameLayout in der Symbolleiste wie folgt hinzufügen:

2voto

Valery Boretsky Punkte 300

Ich habe mehrere Tage damit verbracht, nach einer universellen Lösung zu suchen. Mein Toolbar funktioniert mit dem Android-Menü und dem Nav-Icon.

Zunächst müssen Sie eine benutzerdefinierte Toolbar-Klasse erstellen. Diese Klasse muss die zentrierten Titelpositionen (Padding) 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(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 ein Layout-Toolbar erstellen:

Das ist alles

2voto

Deepak G M Punkte 1620

Auch wenn das Hinzufügen einer TextView zur Toolbar das Problem der Beschränkung des Titelstylings lösen kann, gibt es ein Problem damit. Da wir es nicht zu einem Layout hinzufügen, haben wir nicht viel Kontrolle über dessen Breite. Wir können entweder wrap_content oder match_parent verwenden.

Betrachten Sie nun ein Szenario, in dem wir eine SearchView als Button am rechten Rand der Toolbar haben. Wenn der Titelinhalt mehr ist, wird er über den Button gelegt und verdeckt ihn. Es gibt keine Möglichkeit, dies zu kontrollieren, außer der Festlegung einer Breite für das Label, was Sie nicht tun möchten, wenn Sie ein responsives Design haben möchten.

Also, hier ist eine Lösung, die für mich funktioniert hat, die sich etwas von der Hinzufügung einer TextView zur Toolbar unterscheidet. Anstatt das, fügen Sie die Toolbar und TextView zu einem RelativeLayout hinzu und stellen Sie sicher, dass die TextView über der Toolbar liegt. Dann können wir geeignete Abstände verwenden und sicherstellen, dass die TextView dort erscheint, wo wir möchten.

Vergewissern Sie sich, dass Sie die Toolbar so einstellen, dass der Titel nicht angezeigt wird.

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

Löst das Problem, das @ankur-chaudhary oben erwähnt hat.

2voto

Uzair Ahmed Punkte 33

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

2voto

Diya Bhat Punkte 205

Versuchen Sie, die Symbolleiste und den Titel in einer separaten Ansicht zu platzieren. Nehmen Sie eine Ansicht am rechten Ende und geben Sie ihnen ein Gewicht, das gleich dem Gewicht der Symbolleiste ist. Auf diese Weise wird Ihr Titel in der Mitte angezeigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X