it-swarm.com.ru

Название центральных панелей инструментов Android и пользовательский шрифт

Я пытаюсь выяснить, как правильно использовать собственный шрифт для заголовка панели инструментов, и отцентрировать его на панели инструментов (требование клиента).

В данный момент я использую старый добрый ActionBar, и я устанавливал заголовок на пустое значение, и использовал setCustomView, чтобы поместить свой собственный шрифт TextView и отцентрировать его, используя ActionBar.LayoutParams.

Есть ли лучший способ сделать это? Использование новой панели инструментов в качестве моего ActionBar.

306
Mathbl

Чтобы использовать пользовательский заголовок в вашей Toolbar, все, что вам нужно сделать, это помнить, что Toolbar - это просто модная ViewGroup, поэтому вы можете добавить пользовательский заголовок следующим образом:

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

Это означает, что вы можете стилизовать TextView так, как вам хочется, потому что это просто обычная TextView. Таким образом, в вашей деятельности вы можете получить доступ к названию следующим образом:

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

Название панели инструментов является стилем. Любая настройка, которую вы делаете, должна быть сделана в теме. Я приведу вам пример.

Макет панели инструментов:

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

Стили:

<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

Это просто, чтобы помочь объединить все части, используя @ MrEngineer13 answer с комментариями @Jonik и @Rick Sanchez с правильным порядком, помогающим легко добиться центрирования заголовка !!

Макет с 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>

Способ достижения с правильным заказом:

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

Пожалуйста, не забудьте высказать свое мнение @ MrEngineer13 ответ !!!

Вот пример проекта ToolbarCenterTitleSample

 enter image description here

Надеюсь помочь кому-то еще;)

54
Gueorgui Obregon

у нас нет прямого доступа к заголовку TextView панели инструментов, поэтому мы используем отражение для доступа к нему.

  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

Вот текстозависимый подход к заголовку, чтобы найти экземпляр TextView из 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;
}
29
Nikola Despotoski

Определите следующий класс:

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

... а затем просто используйте его вместо обычного Toolbar, например так:

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

Вам все еще нужны эти две строки кода в вашей Activity (как со стандартной 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);

Это оно! Вам не нужно скрывать стандартный заголовок с выравниванием по левому краю, не нужно дублировать один и тот же XML-код снова и снова и т.д., Просто используйте CenteredToolbar, как если бы он был по умолчанию Toolbar. Вы также можете установить свой собственный шрифт программно, поскольку теперь у вас есть прямой доступ к TextView. Надеюсь это поможет.

16
fraggjkee

Никто не упомянул об этом, но есть некоторые атрибуты для Toolbar:

app:titleTextColor для установки цвета текста заголовка

app:titleTextAppearance для настройки внешнего вида текста заголовка

app:titleMargin для установки поля

И есть другие определенные поля стороны, такие как marginStart, и т.д.

14
Ab_

Я использую это решение:

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

Без панели инструментов TextView мы можем настроить шрифт, используя приведенный ниже код

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
Ajit Kumar Dubey

Планировка:

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

Код:

    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

Вы можете использовать как следующее

 <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

Решение, которое я использовал для этой проблемы:

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

Для центра тяжести я думаю, что было бы необходимо изменить параметры макета на match_parent по горизонтали, а затем:

tv.setGravity(Gravity.CENTER);
2
Monet_z_Polski

Я не знаю, изменилось ли что-нибудь в библиотеке appcompat, но это довольно тривиально, не нужно размышлять.

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

Я решил это решение, и это следующие коды: 

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

И вы можете изменить заголовок/метку, в Activity, напишите следующие коды:

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

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

2
Hai Rom

Очень quick и easy способ установить собственный шрифт - это использовать пользовательский titleTextAppearance с fontFamily:

Добавить в 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>

В папке res создайте папку font (например: varela_round_regular.ttf)

Прочтите официальное руководство, чтобы узнать больше https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

2
vovahost

Обновление от ответа @ MrEngineer13: чтобы выровнять центр заголовка в любых случаях, включая значок гамбургера, меню опций, вы можете добавить FrameLayout в панель инструментов следующим образом: 

   <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

Поскольку Android.support.v7.appcompat 24.2Toolbar имеет метод setTitleTextAppearance, и вы можете установить его шрифт без внешнего textview.

создать новый стиль в styles.xml

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

и использовать это

mToolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);
1
Rainmaker

Попробуйте взять панель инструментов и титл в отдельном представлении. Взгляните на правый конец и задайте вес, равный весу панели инструментов. Таким образом, ваша грудь окажется в центре.

<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>
1
Diya Bhat

Хотя добавление текстового представления на панель инструментов может решить проблему ограничения стиля заголовка, с ним есть проблема. Поскольку мы не добавляем его в макет, мы не слишком контролируем его ширину. Мы можем использовать либо wrap_content, либо match_parent. 

Теперь рассмотрим сценарий, в котором у нас есть searchView как кнопка на правом краю панели инструментов. Если содержание заголовка больше, оно будет сверху кнопки, скрывая его. Невозможно контролировать этот недостаток, задавая ширину надписи, и это то, что вы не хотите делать, если хотите иметь адаптивный дизайн.

Итак, вот решение, которое сработало для меня, которое немного отличается от добавления текстового представления на панель инструментов. Вместо этого добавьте панель инструментов и текстовое представление в относительный макет и убедитесь, что текстовое представление находится сверху панели инструментов. Затем мы можем использовать соответствующие поля и убедиться, что текстовое представление отображается там, где мы хотим, чтобы оно отображалось.

Убедитесь, что вы установили панель инструментов, чтобы не показывать заголовок.

Вот XML для этого решения:

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

Решает проблему @ 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

Пытаться

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

Я провел несколько дней в поисках универсального решения. Моя панель инструментов работает с меню Android и значком навигации. 

Сначала вам нужно создать собственный класс панели инструментов. Этот класс должен рассчитывать позиции по центру заголовка (отступы): 

    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)

}

Во-вторых, вам нужно создать макет панели инструментов: 

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

Это все 

0
Valery Boretsky

Вы можете иметь собственный TextView на панели инструментов, например:

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

Таким образом, это будет центрировать текст. Если вы хотите добавить собственный шрифт в обычный Toolbar, сделайте <style>:

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

И добавьте его на панель инструментов:

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

Для просмотра текста на панели инструментов вы можете определить его с помощью атрибута fontFamily:

<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

Вы просто должны добавить строку ниже в макете панели инструментов:

app:contentInsetStart="0dp"
0
Diya Bhat

На мой взгляд, у вас есть два варианта:

1) Отредактируйте панель инструментов XML. Когда ваша панель инструментов добавляется в XML, она обычно выглядит так:

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

таким образом, вы можете иметь панель инструментов и настроить текстовое представление и логотип.

2) Программно изменить родной текстовый вид и значок:

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

убедитесь, что ваша панель инструментов не является нулевой, прежде чем устанавливать в нее что-либо.

0
Idan Damri

Настройка Android:gravity="center" у меня сработала

Нет стайлинга, ничего. Панель инструментов в основном ViewGroup все, что вам нужно сделать, это установить гравитацию элементов в ней.

        <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

для настраиваемого шрифта на панели инструментов вы можете переопределить шрифт textView в стиле, а затем каждый текстовый вид в вашем приложении, а также шрифт заголовка панели инструментов, изменялся автоматически Я тестировал его в Android studio 3.1.3

в стиле сделать это:

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

а затем в вашей теме используйте это: 

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

Я нашел другой способ добавить пользовательскую панель инструментов без какого-либо дополнительного кода Java/Kotlin.

  • Во-первых: создайте XML с вашим собственным макетом панели инструментов с AppBarLayout в качестве родителя:

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

  • Второе: включите панель инструментов в свой макет:

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

Я столкнулся с той же проблемой, исправленной в MainActivity.

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

И во фрагменте

@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);
}
0
VINAY DANARADDI

В XML попробуйте это:

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

В коде:

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