Título do centro da barra de ferramentas do Android e fonte personalizada

366

Estou tentando descobrir a maneira correta de usar uma fonte personalizada para o título da barra de ferramentas e centralizá-la na barra de ferramentas (requisito do cliente).

No momento, estou usando o bom e antigo ActionBar, e estava definindo o título como valor vazio e usando setCustomViewpara colocar minha fonte personalizada TextView e centralizá-lo usando ActionBar.LayoutParams.

Existe uma maneira melhor de fazer isso? Usando a nova barra de ferramentas como minha ActionBar.

Mathbl
fonte

Respostas:

718

Para usar um título personalizado, Toolbarbasta lembrar que Toolbaré apenas um ViewGroup sofisticado, para que você possa adicionar um título personalizado da seguinte forma:

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

Isso significa que você pode estilizar o TextViewque quiser, porque é apenas regular TextView. Portanto, em sua atividade, você pode acessar o título da seguinte forma:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
MrEngineer13
fonte
5
sugerimos usar android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_gravity = "center".
SteelBytes
194
Se alguém não puder remover o nome do aplicativo padrão, faça o seguinte: 1. Ligue para setSupportActionBar (yourToolbar) 2. Ligue para getSupportActionBar (). SetDisplayShowTitleEnabled (false);
21715 Rick
75
Para continuar usando estilos padrão para o TextView personalizado, tente algo como style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"( consulte esta resposta ).
31415 Jonik
5
acrescentando android: paddingRight = pode ajudar a centralizar o texto no meio da tela no caso de você ter um botão (casa, gaveta de navegação, etc) "attr / actionBarSize?"
Gordak
5
O que acontecerá quando houver um ícone do Hamburger na barra de ferramentas? Não estará no centro da largura total da barra de ferramentas, estará no centro de ToolbarWidth - HamburgerIconWidth .
Akshay
75

O título da barra de ferramentas é estiloso. Qualquer personalização que você fizer deve ser feita no tema. Eu vou te dar um exemplo.

Layout da barra de ferramentas:

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

Estilos:

<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
fonte
59
Esta é a maneira correta. Adicionando outro TextViewé um pouco hacky, mas a resposta da reflexão é pura maldade.
dariusl
9
Limpo, mas você não pode definir uma fonte personalizada a partir do estilo. Infelizmente.
Niqueco 7/08
20
Você também não pode alterar o alinhamento do título.
Terry
7
@ user1560102 não há nada de hacky em adicionar um TextView à barra de ferramentas. Foi para isso que foi projetado.
Tim Malseed
107
Isso não centraliza o texto.
Sebastian Roth
69

Isso é apenas para ajudar a juntar todas as peças usando a resposta @ MrEngineer13 com @Jonik e @Rick Sanchez comentam com a ordem certa para ajudar a alcançar o título com facilidade!

O layout com 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>

A maneira de alcançar com a ordem certa:

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

Por favor, não esqueça de votar no @ MrEngineer13 answer !!!

Aqui está um exemplo de projeto ToolbarCenterTitleSample

insira a descrição da imagem aqui

Espero ajudar alguém;)

Gueorgui Obregon
fonte
5
se eu definir setDisplayHomeAsUpEnabled (true) e setDisplayShowHomeEnabled (true); para aumentar a seta para trás. Então o título não está chegando ao centro. Eu tentei como definir actionBar.setTitle (""); e setDisplayShowTitleEnabled (false). Mas ainda não é capaz de resolver o problema
Prashanth Debbadwar
Você o testou para um Scrolling Activity?
AN
é verdade que, com a seta para trás, o título não está centralizado (fica à direita pela metade da largura da seta para trás). Suponho que, se estivesse realmente determinado, adicionaria programaticamente uma margem suficiente à direita da caixa de texto, conforme necessário, a fim de centralizar o texto.
Someone Somewhere
52

não temos acesso direto ao título TextView da barra de ferramentas, portanto usamos reflexão para acessá-lo.

  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
fonte
3
Embora isso seja hacky, esta solução funciona para mim depois de tentar encontrar uma maneira de obter acesso à visualização de texto da barra de ferramentas. Obrigado.
falc0nit3
11
Funcionou muito bem para o título. Porém, quando tentou obter o mSubtitleTextView dessa maneira, resultou em uma exceção. Causado por: java.lang.NullPointerException: Tentativa de invocar o método virtual 'void android.widget.TextView.setTypeface (android.graphics.Typeface)' em uma referência de objeto nulo
Vinod
5
Nota: Você pode acessar apenas o campo "mTitleTextView" depois de definir o título da barra de ferramentas! O campo é preguiçoso inicializado pelo seu primeiro uso.
funcoder
2
E se você ofuscar seu código com o ProGuard e mTitleTextViewse tornar abcde12345?
voghDev
11
@voghDev getDeclaredField lançará NoSuchFieldException nesse caso, resultando no código não funcionando.
Jeremy
30

Aqui está uma abordagem dependente do texto do título para encontrar a TextViewinstância 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
fonte
28

Defina a seguinte classe:

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

... e apenas use-o em vez de regular Toolbarcomo este:

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

Você ainda precisa dessas 2 linhas de código no seu Activity(como no padrão 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);

É isso aí! Você não precisa ocultar o título alinhado à esquerda padrão, não precisa duplicar o mesmo código XML repetidamente, etc., use apenas CenteredToolbarcomo se fosse o padrão Toolbar. Você também pode definir sua fonte personalizada programaticamente, pois agora você tem acesso direto ao TextView. Espero que isto ajude.

fraggjkee
fonte
11
Obrigado! A melhor solução, só que não se esqueça de importar para a barra de ferramentas "v7.widget"
David
Sei que isso é bastante antigo, mas ... como posso mudar a cor do texto? Eu tentei em XML com app: titleTextColor e em código com centeredTitleTextView.setColor. Alguma idéia, @fraggjkee?
Genaro Alberto Cancino Herrera
centeredTitleTextView.setTextColor(...)deve trabalhar
fraggjkee
Não deveria ser LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)?
liminal
16

Ninguém mencionou isso, mas existem alguns atributos para Toolbar:

app:titleTextColor para definir a cor do texto do título

app:titleTextAppearance para definir a aparência do texto do título

app:titleMargin para definir a margem

E há outras margens específicas, como marginStartetc.

Ab ِ
fonte
11
Solução perfeita .. se você está ciente de FontOverride , basta criar estilo em styles.xml <style name="customFontTextAppearanceStyle"> <item name="android:textSize">18sp</item> <item name="android:typeface">monospace</item> e aplicá-lo na barra de ferramentas app:titleTextAppearance="@styles/customFontTextAppearanceStyle"
Chinmay Thoriya
2
Eu usei esse método, mas nada aconteceu na minha barra de ferramentas! Eu criei um novo '<style>' e defina-o app:titleTextAppearanc="style name" no android.support.v7.widget.ToolbarTAG
UM
12

Eu uso esta solução:

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
fonte
11
Funciona muito bem, mas, por algum motivo, não é centralizado corretamente com barras de ferramentas que não possuem um botão de item.
Munib 28/08
11
Uma adição: se você tiver um ícone de desenho ou de navegação na barra de ferramentas, o título não ficará exatamente no centro. Eu adiciono um ícone de menu de configuração vazio para esta situação. Meu item de menu vazio é: <item android: id = "@ + id / vazio" android: orderInCategory = "100" android: icon = "@ android: cor / transparente" app: showAsAction = "always" tools: ignore = " MenuTitle "/>
Mete
10

Sem a barra de ferramentas TextView, podemos personalizar a fonte usando o código abaixo

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
fonte
11
Se você apenas precisar alterar a fonte, esta parece ser a solução mais limpa. NOTA: TypefaceSpanString é apenas isso: 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);
    }
}
Shatazone
fonte
11
A solução funciona muito bem quando você coloca as duas últimas linhas de código, não deve estar dentro do loop for: // Restaurar título e legenda 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>

Código:

    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
fonte
11
Eu acho que "int width = maxWidth - titleWidth * 2;" deve ser "int width = maxWidth - iconWidth * 2;", pensa!
oldfeel
4

Eu resolvi esta solução, e este é um dos seguintes códigos:

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

E você pode alterar o título / etiqueta. Em Atividade, escreva os códigos abaixo:

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

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

Hai Rom
fonte
4

Você pode usar como o seguinte

 <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>
A Sharma
fonte
se eu definir setDisplayHomeAsUpEnabled (true) e setDisplayShowHomeEnabled (true); para aumentar a seta para trás. Então o título não está chegando ao centro. Eu tentei como definir actionBar.setTitle (""); e setDisplayShowTitleEnabled (false). Mas ainda não é capaz de resolver o problema
Prashanth Debbadwar
4

Uma maneira muito rápida e fácil de definir uma fonte personalizada é usar uma personalizada titleTextAppearancecom fontFamily:

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

Na sua pasta res, crie uma pasta de fontes (Ex: varela_round_regular.ttf )

Leia o guia oficial para saber mais https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

vovahost
fonte
3

Não sei se alguma coisa mudou na biblioteca appcompat, mas é bastante trivial, sem necessidade de reflexão.

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

Solução que eu usei para esse problema:

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

Para a gravidade central, acho que seria necessário alterar os parâmetros de layout para match_parent horizontalmente e depois:

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

Atualização da resposta de @ MrEngineer13: para alinhar o centro do título em qualquer caso, incluindo o ícone Hamburger, menus de opções, você pode adicionar uma FrameLayoutbarra de ferramentas na seguinte:

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

Em XML, tente o seguinte:

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

Em código:

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

Embora a adição de uma exibição de texto à barra de ferramentas possa resolver o problema da restrição de estilo de título, há um problema. Como não o estamos adicionando a um layout, não temos muito controle sobre sua largura. Podemos usar wrap_content ou match_parent.

Agora considere um cenário em que temos um searchView como um botão na borda direita da barra de ferramentas. Se o conteúdo do título for maior, ele aparecerá no topo do botão que o obscurece. Não há como controlar essa falta de definir uma largura para o rótulo e isso é algo que você não deseja fazer se quiser ter um design responsivo.

Então, aqui está uma solução que funcionou para mim que é um pouco diferente de adicionar uma visualização de texto à barra de ferramentas. Em vez disso, adicione a barra de ferramentas e a exibição de texto a um layout relativo e verifique se a exibição de texto está na parte superior da barra de ferramentas. Em seguida, podemos usar as margens apropriadas e garantir que a exibição do texto seja exibida onde queremos que seja exibida.

Certifique-se de definir a barra de ferramentas para não mostrar o título.

Aqui está o XML para esta solução:

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

Resolve o problema @ ankur-chaudhary mencionado acima.

Deepak GM
fonte
2

Desde android.support.v7.appcompat 24.2 Toolbarhas method setTitleTextAppearancee você pode definir sua fonte sem fonte externa.textview .

crie um novo estilo em styles.xml

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

e use

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

Passei vários dias procurando uma solução universal. Minha barra de ferramentas trabalhando com o menu do Android e o ícone de navegação.

Inicialmente, você precisa criar uma classe de barra de ferramentas personalizada. Esta classe deve ter calculado as posições centradas no título (preenchimentos):

    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)

}

Em segundo lugar, você precisa criar a barra de ferramentas de layout:

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

Isso é tudo

Valery Boretsky
fonte
2

Tente usar a Barra de Ferramentas e inclinar em uma exibição separada. Dê uma olhada na extremidade direita e dê a eles peso igual ao peso da barra de ferramentas. Desta forma, o seu til vai entrar no centro.

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

Você pode inserir esse código no seu arquivo xml

 <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
fonte
Oi Uzair. Qual arquivo xml? Estou usando um projeto do Android Studio 3.6.3 criado a partir de um modelo de atividade vazia. Obrigado.
Amor e paz - 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
fonte
1

Configuração android:gravity="center" funcionou para mim

Nada de estilo. A barra de ferramentas é basicamente ViewGrouptudo que você precisa fazer é definir a gravidade dos elementos nela.

        <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
fonte
8
Não funciona comandroidx.appcompat.widget.Toolbar
tmm1 26/10/18
1

para fonte personalizada na barra de ferramentas, você pode substituir a fonte textView em grande estilo e, em seguida, todas as textView no aplicativo e a fonte do título da barra de ferramentas foram alteradas automaticamente. estúdio android 3.1.3

em grande estilo fazê-lo:

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

e, em seu tema, use o seguinte:

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

Encontrei outra maneira de adicionar barra de ferramentas personalizada sem nenhum código Java / Kotlin adicional.

  • Primeiro: crie um XML com seu layout de barra de ferramentas personalizado com AppBarLayout como pai:

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

  • Segundo: inclua a barra de ferramentas no seu layout:

    <?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>
Ângelo Polotto
fonte
1

A meu ver, você tem duas opções:

1) Edite o XML da barra de ferramentas. Quando sua barra de ferramentas é adicionada ao XML, geralmente se parece com isso:

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

se você quiser personalizá-lo, remova o '/' no final e faça assim:

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

Dessa forma, você pode ter uma barra de ferramentas e personalizar a visualização de texto e o logotipo.

2) Altere programaticamente a visualização de texto e o ícone nativos:

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

verifique se a barra de ferramentas não é nula antes de definir algo nela.

Idan Damri
fonte
1

Você pode personalizar TextViewna barra de ferramentas assim:

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

Então, isso centralizará o texto. Se você deseja adicionar uma fonte personalizada ao normal Toolbar, faça um <style>:

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

E adicione-o à barra de ferramentas:

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

Para a visualização de texto na barra de ferramentas, você pode defini-la com o fontFamilyatributo:

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

Eu estava enfrentando o mesmo problema, corrigido ao fazer isso em MainActivity

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

E Em Fragmento

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