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.

35voto

fraggjkee Punkte 3420

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 verwenden Sie es einfach anstelle des regulären Toolbar wie folgt:

Sie benötigen immer noch diese 2 Zeilen Code in Ihrer Activity (wie bei der Standard Toolbar):

Toolbar toolbar = (Toolbar) findViewByid(R.id.toolbar); // Beachten Sie, dass Ihre Aktivität nicht wissen muss, dass es sich tatsächlich um einen benutzerdefinierten Toolbar handelt
setSupportActionBar(binding.toolbar);

Das ist alles! Sie müssen den standardmäßig linksbündigen Titel nicht ausblenden, müssen den gleichen XML-Code nicht immer wieder duplizieren, usw., verwenden Sie einfach CenteredToolbar wie wenn es die Standard-Toolbar wäre. Sie können auch Ihre benutzerdefinierte Schriftart programmgesteuert festlegen, da Sie jetzt direkten Zugriff auf das TextView haben. Hoffentlich hilft dies.

30voto

Nikola Despotoski Punkte 48592

Hier ist der titeltextabhängige Ansatz zur Suche nach einer TextView-Instanz aus der 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;
    // kann nicht gefunden werden, wenn der Titel nicht gesetzt ist
    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 weist keine ID zu Ansichten mit Layoutparametern SYSTEM zu, daher getId() == View.NO_ID
                // in gleicher Weise kann der Untertitelltext TextView erhalten werden.
                return t;
            }
        }
    }
    return null;
}

17voto

Ali Bdeir Punkte 4519

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

app:titleTextColor für die Einstellung der Titeltextfarbe

app:titleTextAppearance für das Einstellen der Titeltextdarstellung

app:titleMargin für das Einstellen des Randes

Und es gibt auch andere spezifische Seitenränder wie marginStart, usw.

17voto

ultraon Punkte 1870

Ich verwende diese Lösung:

static void centerToolbarTitle(@NonNull final Toolbar toolbar) {
    final CharSequence title = toolbar.getTitle();
    final ArrayList 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();
        //you can also use titleView for changing the font: titleView.setTypeface(Typeface);
    }
}

10voto

Ajit Kumar Dubey Punkte 1353

Ohne Toolbar-TextView können wir die Schriftart mit dem folgenden Code anpassen

getSupportActionBar().setDisplayShowTitleEnabled(false);
oder
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);
}

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