web-dev-qa-db-fra.com

Android: Comment centrer le titre dans la barre d'outils

J'utilise ToolBar dans mon projet pour la première fois, donc je ne sais pas comment personnaliser la barre d'outils sous Android. Je dois centrer le titre dans la barre d’outils et comment le faire, merci de me le dire.

Merci d'avance.

14

Rappelez-vous que Toolbar est juste une ViewGroup comme les autres. Donc, vous pouvez y insérer Views. Dans votre cas, vous avez besoin d'une TextView dans une Toolbar

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent">

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:text="Some Fancy Title"
        Android:gravity = "center"
        Android:id="@+id/toolbar_title" />

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

Maintenant, définissez la Toolbar comme barre d’action en la récupérant d’abord puis en utilisant la setSupportActionBar() 

La gravité de TextView étant définie sur center, le texte doit être centré.

31
Little Child

Le problème avec le simple ajout d’un TextView au centre aligné de la barre d’outils est l’ajout d’éléments de menu dans la barre d’outils qui décaleront le texte centré.

Pour contourner ce problème, j'ai superposé le texte au-dessus de la barre d'outils, pas à l'intérieur. De cette manière, peu importe le nombre d'icônes que vous ajoutez, cela ne compensera pas le texte centré:

<Android.support.design.widget.AppBarLayout
    Android:id="@+id/appbar_layout"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">
    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
        </Android.support.v7.widget.Toolbar>

        <TextView
            Android:layout_centerInParent="true"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@string/app_name"/>

    </RelativeLayout>
</Android.support.design.widget.AppBarLayout>

De cette façon, aucune logique supplémentaire n'est nécessaire pour compenser l'espacement de décalage des boutons Précédent/menu de débordement/icônes de recherche etc. sur la barre d'outils, car le texte centré est au-dessus de celle-ci, mais pas à l'intérieur.

28
jesobremonte

Vous pouvez forcer la barre d’outils au centre en encapsulant le rembourrage droit et le droit de niveau qui contient le rembourrage gauche par défaut pour le titre. Placez ensuite la couleur d’arrière-plan dans le parent de la barre d’outils afin que la partie découpée en enveloppant le titre soit de la même couleur (blanc dans mon exemple):

<Android.support.design.widget.AppBarLayout
    Android:id="@+id/appbar_layout"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@color/white">

            <Android.support.v7.widget.Toolbar
               Android:id="@+id/toolbar"
               Android:layout_width="wrap_content"
               Android:layout_height="56dp"
               Android:layout_gravity="center_horizontal"
               Android:paddingEnd="15dp"
               Android:paddingRight="15dp"
               Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
               app:titleTextColor="@color/black"/>

</Android.support.design.widget.AppBarLayout>
9
tompadre

La barre d'outils est un groupe de vues. so To Center Align Le texte Utiliser 

app_bar.xml

<?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/in.chabu"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="?attr/colorPrimary"
    app:theme="@style/ToolBarTheme" 
    Android:minHeight="?attr/actionBarSize">

     <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/title_activity_sign_up"
        Android:layout_gravity="center"
        Android:id="@+id/toolbar_title" 
        Android:textStyle="bold"
        Android:textColor="@Android:color/white"/>

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

activity_sign_up

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="in.chabu.activities.SignUpActivity" >

    <include 
        Android:id="@+id/tool_bar"
        layout="@layout/app_bar"/>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/tool_bar"
        Android:text="@string/hello_world" />

</RelativeLayout>

Avtivité

public class SignUpActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_up);

        Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);

        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayShowTitleEnabled(false);
    }


}
9

Lorsque vous avez le bouton principal ou le bouton principal en même temps que le titre centré et que le titre n'est plus centré et qu'il est légèrement déplacé vers la droite, définissez votre texte comme largeur = wrap_content et layout_gravity = center

<TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"/>
8
Harry Aung

L'interface utilisateur finale ressemble à:  enter image description here Pour mon projet, j'ai l'icône de navigation à gauche et les menus (plus de 1) à droite et je veux mettre le titre au centre. 

J'ai setSupportActionBar(toolbar) et _actionBar.setCustomView(R.layout.actionbar_filter);. Mon fichier de mise en page:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:id="@+id/lib_action_bar_filter_view_layout"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:background="?attr/selectableItemBackgroundBorderless"
                Android:gravity="center">

    <TextView
        Android:id="@id/lib_action_bar_filter_view"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:gravity="center"
        Android:maxLines="2"
        Android:paddingLeft="5dp"
        Android:paddingRight="5dp"
        Android:textColor="@Android:color/white"
        Android:textSize="15sp"/>

</RelativeLayout>

Ma barre d’outils s’allonge sur Android.support.v7.widget.Toolbar, puis (genre de code dur) mesure la taille de RelativeLayout, pour finalement la disposer au centre horizontal.

/**
 * Customized the <code>RelativeLayout</code> inside the <code>Toolbar</code>.
 * Because by default the custom view in the <code>Toolbar</code> cannot set
 * width as our expect value. So this class allows setting the width of the
 * <code>RelativeLayout</code> to take up any percentage of the screen width.
 */
public class CenteredToolbar extends Toolbar {

private static final double WIDTH_PERCENTAGE = 0.8;

private TextView titleView;

public CenteredToolbar(Context context) {
    this(context, null);
}

public CenteredToolbar(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, Android.support.v7.appcompat.R.attr.toolbarStyle);
}

public CenteredToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int childCount = getChildCount();
    for (int i = 0; i < childCount; i++) {
        View view = this.getChildAt(i);
        if (view instanceof RelativeLayout) {
            int width = getMeasuredWidth();
            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
            layoutParams.width = (int) (width * WIDTH_PERCENTAGE);
            view.setLayoutParams(layoutParams);
            break;
        }
    }
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    int childCount = getChildCount();
    for (int i = 0; i < childCount; i++) {
        View view = this.getChildAt(i);
        if (view instanceof RelativeLayout) {
            forceTitleCenter(view);
            break;
        }
    }
}

/**
 * Centering the layout.
 *
 * @param view The view to be centered
 */
private void forceTitleCenter(View view) {
    int toolbarWidth = getMeasuredWidth();
    int relativeLayoutWidth = view.getMeasuredWidth();
    int newLeft = (int) (toolbarWidth - relativeLayoutWidth) / 2;
    int top = view.getTop();
    int newRight = newLeft + relativeLayoutWidth;
    int bottom = view.getBottom();
    view.layout(newLeft, top, newRight, bottom);
}
}

Joindre ma mise en page de la barre d'outils. Peut-être que vous n'avez pas besoin de ça, je suis juste en train de coller ici pour la référence de quelqu'un:

<?xml version="1.0" encoding="utf-8"?>
<com.chinalwb.CenteredToolbar
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/vmosolib_toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    Android:elevation="4dp"
    app:contentInsetEnd="0dp"
/>
6
LiuWenbin_NO.

Il ne suffit pas de placer une autre TextView dans Toolbar pour centrer le titre par rapport à l'écran, sa position dépendra des autres éléments d'une barre d'outils (bouton Précédent, éléments de menu).

Pour centrer le titre, vous pouvez définir manuellement sa position:

Étendez la classe Android.support.v7.widget.Toolbar et apportez les modifications suivantes: 

  1. ajouter TextView
  2. remplacer onLayout() et définir TextView location pour la centrer (titleView.setX((getWidth() - titleView.getWidth())/2))
  3. remplacer setTitle() où définir le titre du titre sur la nouvelle vue de texte
 Classe publique CenteredToolbar extend Toolbar {

 private TextView titleView; 

 public CenteredToolbar (contexte de contexte) {
 this (contexte, null); 
 } 

 public CenteredToolbar (contexte de contexte, @Nullable AttributeSet attrs) {
 this (contexte, attrs, Android.support.v7.appcompat.R.attr.toolbarStyle); 
 } 

 public CenteredToolbar (contexte de contexte, @Nullable AttributeSet attrs, int defStyleAttr) {
 super (contexte, attrs, defStyleAttr); 

 titleView = new TextView (getContext ()); 

 int textAppearanceStyleResId; 
 TypedArray a = context.getTheme (). GetStyledAttributes (attrs, 
 New int [] {Android.support.v7.appcompat.R.attr.titleTextAppearance}, defStyleAttr, 0); 
 essayez {
 textAppearanceStyleResId = a.getResourceId (0, 0); 
 } enfin {
 a.recycle (); 
 } 
 if (textAppearanceStyleResId> 0) {
 titleView.setTextAppearance (context, textAppearanceStyleResId);
 } 

 addView (titleView, new LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
 } 

 @Passer outre
 protected void onLayout (booléen modifié, intl, int t, int r, int b) {
 super.onLayout (modifié, l, t, r, b); 
 titleView.setX ((getWidth () - titleView.getWidth ())/2);
 } 

 @Passer outre
 public void setTitle (titre de CharSequence) {
 titleView.setText (title); 
 }
 } 

Dans layout, vous pouvez utiliser cette classe comme ceci:

<com.example.CenteredToolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    Android:elevation="4dp"
    Android:theme="@style/ToolbarTheme"/>

De même, pour que le nouveau titre ressemble à un titre standard, vous devez appliquer le style titleTextAppearance à la nouvelle TextView (titleView.setTextAppearance(context, textAppearanceStyleResId)).

6
user2137020

Dans la mesure où la barre d’outils est un groupe de vues vous permettant de créer des mises en page à l'intérieur de celui-ci . Suivez ces étapes

1-Créez une vue de texte dans votre barre d’outils 2-Créez votre centre de gravité de vue de texte

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

        <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.Android.com/apk/res-auto"
            Android:id="@+id/profile_image"
            Android:layout_width="44dp"
            Android:layout_height="55dp"
            Android:src="@drawable/profile"
            app:civ_border_color="@color/secondary_text"
            app:civ_border_width="2dp" />
        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:text="Title"
            Android:gravity="center"
            style="@style/Base.TextAppearance.AppCompat.Widget.ActionBar.Title"
            />


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

Vérifiez la réponse complète ici: https://stackoverflow.com/a/35723158/445548

    public void centerTitleAndSubtitle(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);

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

        // Restore title and subtitle
        toolbar.setTitle(originalTitle);
        toolbar.setSubtitle(originalSubtitle);
    }
}
1
Shatazone

Utiliser un titre personnalisé (avec le centre de gravité) dans la barre d'outils 

     <Android.support.v7.widget.Toolbar           
         Android:layout_width="match_parent"
         Android:layout_height="?attr/actionBarSize"
         Android:animateLayoutChanges="true"
         Android:backgroundTint="@color/colorPrimary"
         Android:background="?attr/colorPrimary"
         Android:elevation="4dp"
         Android:minHeight="?android:attr/actionBarSize"
         app:layout_collapseMode="pin"
         app:layout_scrollFlags="scroll|exitUntilCollapsed"
         app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
         app:popupTheme="@style/AppTheme.PopupOverlay"
         app:titleTextAppearance="@style/Toolbar.TitleText" >

      <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/toolbar_title"
            Android:text="Title"
            Android:layout_gravity="center"/>

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

La meilleure solution consiste à utiliser une TextView imbriquée dans la ToolBar, puis à définir le layout_width et le layout_height sur wrap_content. Puis définissez le layout_gravity sur center. De cette manière, il n’est pas compensé par d’autres icônes dans la variable toolbar.

0
kooldeji

mettre collapsedTitleGravity au centre 

<Android.support.design.widget.AppBarLayout
        Android:layout_width="match_parent"
        Android:layout_height="150dp"
        Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsing_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:collapsedTitleGravity="center"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="20dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">


            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                Android:fitsSystemWindows="true"
                app:layout_collapseMode="pin"
                app:titleMarginTop="10dp"
                app:layout_scrollFlags="scroll|enterAlways" ></Android.support.v7.widget.Toolbar>

        </Android.support.design.widget.CollapsingToolbarLayout>

    </Android.support.design.widget.AppBarLayout>
0
ZIRES

Je ne vous ai pas compris Question complètement .. mais j'ai trouvé une solution Comme celle-ci 

Pour utiliser un titre personnalisé dans votre barre d’outils, il vous suffit de vous rappeler que la barre d’outils n’est qu’un fantastique ViewGroup. Vous pouvez donc ajouter un titre personnalisé comme ceci:

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

Cela signifie que vous pouvez attribuer un style à la TextView comme vous le souhaitez, car il s’agit simplement d’une TextView normale. Donc, dans votre activité, vous pouvez accéder au titre comme suit:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
0
JayaSantoshKumar