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.
Rappelez-vous que Toolbar
est juste une ViewGroup
comme les autres. Donc, vous pouvez y insérer View
s. 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é.
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.
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>
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);
}
}
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"/>
L'interface utilisateur finale ressemble à: 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"
/>
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:
TextView
onLayout()
et définir TextView
location pour la centrer (titleView.setX((getWidth() - titleView.getWidth())/2)
)setTitle()
où définir le titre du titre sur la nouvelle vue de texteClasse 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)
).
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>
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);
}
}
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>
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
.
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>
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);