it-swarm.com.de

Android-Symbolleistentitel und benutzerdefinierte Schriftart

Ich versuche, den richtigen Weg zu finden, um eine benutzerdefinierte Schriftart für den Titel der Symbolleiste zu verwenden und sie in der Symbolleiste zu zentrieren (Clientanforderung).

Im Moment verwende ich die gute alte ActionBar. Ich habe den Titel auf einen leeren Wert gesetzt und setCustomView verwendet, um meine benutzerdefinierte Schriftart TextView zu platzieren und sie mit ActionBar.LayoutParams zu zentrieren.

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

306
Mathbl

Um einen benutzerdefinierten Titel in Ihrer Toolbar zu verwenden, müssen Sie sich lediglich daran erinnern, dass Toolbar nur eine fantastische ViewGroup ist.

<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 die TextView beliebig gestalten können, da es sich um eine reguläre TextView handelt. So können Sie in Ihrer Aktivität auf den Titel wie folgt zugreifen:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
610
MrEngineer13

Der Toolbar-Titel ist anpassbar. Jede von Ihnen vorgenommene Anpassung muss im Design vorgenommen werden. Ich gebe dir ein Beispiel.

Werkzeugleistenlayout:

<?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" />

Styles:

<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>
73
Binoy Babu

Dies ist nur zur Hilfe, um alle Teile mit @ MrEngineer13 answer zu verbinden - mit @Jonik und @Rick Sanchez-Kommentaren mit der richtigen Reihenfolge, um zu helfen, den Titel leicht zu erreichen !!

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

Vergessen Sie nicht, @ MrEngineer13 eine Antwort zu erhalten !!!

Hier ist ein Beispielprojekt ToolbarCenterTitleSample

 enter image description here

Hoffe, jemand anderem zu helfen;)

54

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;
}
49
BugsBunnyBR

Hier ist der Titeltext-abhängige Ansatz, um TextView Instanz aus Toolbar zu finden.

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

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 verwenden Sie es statt wie üblich Toolbar wie 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 diese 2 Codezeilen immer noch in Ihrer 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, Sie müssen denselben XML-Code nicht immer wieder duplizieren usw., verwenden Sie einfach CenteredToolbar, als wäre es der Standardwert Toolbar. Sie können Ihren benutzerdefinierten Zeichensatz auch programmgesteuert festlegen, da Sie jetzt direkten Zugriff auf TextView haben. Hoffe das hilft.

16
fraggjkee

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

app:titleTextColor zum Einstellen der Titeltextfarbe

app:titleTextAppearance zum Einstellen des Titeltexts

app:titleMargin zur Einstellung des Randes

Und es gibt andere Margen auf der spezifischen Seite wie marginStart usw.

14
Ab_

Ich verwende 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);
    }
}
10
ultraon
    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);
    }
}
8
Shatazone

Ohne die Symbolleiste TextView können wir die Schrift 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);
}
8

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

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>
3
A Sharma

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

Ich denke, für die Schwerpunktsschwerpunktposition müsste es notwendig sein, die Layoutparameter zu ändern, um match_parent horizontal anzupassen und dann:

tv.setGravity(Gravity.CENTER);
2
Monet_z_Polski

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

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;
    }
}
2
headsvk

Ich habe diese Lösung gelöst, und dies ist folgende Codes: 

<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/Beschriftung ändern, unter Aktivität einen der folgenden Codes schreiben:

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

TextView mTitle = (TextView) toolbarTop.findViewById (R.id.toolbar_title);

2
Hai Rom

Eine sehr quick - und easy - Methode zum Festlegen einer benutzerdefinierten Schriftart besteht in der Verwendung einer benutzerdefinierten titleTextAppearance mit einer fontFamily:

Hinzufügen zu styles.xml:

<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 Ordner res einen Ordner font (Beispiel: varela_round_regular.ttf

Lesen Sie den offiziellen Leitfaden, um mehr zu erfahren https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

2
vovahost

Versuchen Sie, Toolbar und Tittle in einer separaten Ansicht anzuzeigen. Sehen Sie sich das rechte Ende an und geben Sie ihnen das Gewicht der Symbolleiste. 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>
2
Diya Bhat

Update von @ MrEngineer13's Antwort: Um die Titelmitte in jedem Fall einschließlich Hamburger Symbol und Optionsmenüs auszurichten, können Sie eine FrameLayout in der Symbolleiste wie folgt 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>
1
R4j

Da Android.support.v7.appcompat 24.2Toolbar die Methode setTitleTextAppearance hat und Sie deren Schriftart ohne externe textview einstellen können.

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

Ich hatte das gleiche Problem, das durch die Ausführung 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 im 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);
}
1
VINAY DANARADDI

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

Betrachten wir nun ein Szenario, in dem sich eine searchView als Schaltfläche am rechten Rand der Symbolleiste befindet. Wenn der Titel mehr enthält, wird er über der Schaltfläche angezeigt, die ihn verdeckt. Es gibt keine Möglichkeit, dies zu kontrollieren, indem Sie dem Etikett eine Breite zuweisen, und Sie möchten dies nicht tun, wenn Sie ein responsives Design wünschen.

Hier ist eine Lösung, die für mich funktioniert hat, die sich etwas vom Hinzufügen einer Textansicht zur Symbolleiste unterscheidet. Fügen Sie stattdessen die Symbolleiste und die Textansicht einem relativen Layout hinzu und stellen Sie sicher, dass sich die Textansicht über 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.

0
Deepak G M
***To use a custom title in your Toolbar  you can add a custom title like** :*


<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    Android:elevation="5dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark">


        <LinearLayout
            Android:id="@+id/lnrTitle"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:gravity="center_horizontal"
            Android:orientation="vertical">

            <TextView
                Android:id="@+id/txvHeader"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="center_horizontal|center"
                Android:gravity="center"
                Android:ellipsize="end"
                Android:maxLines="1"
                Android:text="Header"
                Android:textColor="@color/white"
                Android:textSize="18sp" />


        </LinearLayout>


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

**Define Toolbar id in Activity Like:**

Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() == null)
            return;
        getSupportActionBar().setTitle("Title");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
0
Alok Singh

Versuchen

@Override
    public void onBackPressed() {
          if(getTitle().equals(getResources().getString(R.string.app_name))) {
            super.onBackPressed();}
          else {
//set visiblity
           }
}
0
Sỹ Phạm

Ich habe mehrere Tage lang nach einer universellen Lösung gesucht. Meine Symbolleiste für das Android-Menü und das Nav-Symbol. 

Zuerst müssen Sie eine benutzerdefinierte Symbolleistenklasse erstellen. Diese Klasse muss über Titel zentrierte Positionen (Auffüllungen) verfügen: 

    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 benötigen Sie eine Layout-Symbolleiste: 

<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 

0
Valery Boretsky

Sie können eine benutzerdefinierte TextView in der Symbolleiste folgendermaßen anzeigen:

<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 einer normalen Toolbar eine benutzerdefinierte Schriftart hinzufügen möchten, erstellen Sie einen <style>:

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

Und füge es der Symbolleiste hinzu:

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

Für die Textansicht in der Symbolleiste können Sie sie mit dem Attribut fontFamily 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>
0
Gourav

Sie müssen nur die folgende Zeile in Ihr Symbolleistenlayout einfügen:

app:contentInsetStart="0dp"
0
Diya Bhat

Wie ich es sehe, haben Sie zwei Möglichkeiten:

1) Bearbeiten Sie die Symbolleiste XML. Wenn Ihre Toolbar in XML eingefügt wird, sieht das 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 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 haben 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 irgendetwas darin festlegen.

0
Idan Damri

Einstellung Android:gravity="center" hat für mich gearbeitet

Kein Styling nichts. Die Symbolleiste ist im Grunde eine ViewGroup. Alles was Sie tun müssen, ist die Schwerkraft der Elemente darin festzulegen.

        <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" />
0
Hitesh Sahu

für benutzerdefinierte Schriftarten in der Symbolleiste können Sie textView-Schriftarten im Stil überschreiben. Anschließend wird jede Textansicht in Ihrer App sowie die Symbolleisten-Titelschriftart automatisch geändert Ich habe sie in Android studio 3.1.3 getestet.

im stil tun sie es:

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

und dann in Ihrem Thema verwenden Sie dies: 

<item name="Android:textViewStyle">@style/defaultTextViewStyle</item>
0
Ali Khaki

Ich habe einen anderen Weg gefunden, um benutzerdefinierte Symbolleisten 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>
    
0
Ângelo Polotto
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();
                }
            });
        }
    }
}
0
wklbeta

In XML versuchen Sie 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);
0
mohamad sheikhi