android toolbar

Android: Cómo centrar el título en la barra de herramientas



toolbar (18)

¡Esto hizo mi trabajo!

Toolbar toolbar = findViewById(R.id.mytoolbar); TextView titleText = getProperties(new TextView(this)); FrameLayout frameLayout = new FrameLayout(this); frameLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)); frameLayout.addView(titleText); toolbar.addView(frameLayout); setSupportActionBar(toolbar);

Método para establecer las propiedades de TextView

private TextView getProperties(TextView titleText){ titleText.setText(wallpaperName); titleText.setTextColor(Color.WHITE); titleText.setTextSize(18f); titleText.setShadowLayer(2f,2f,2f,Color.BLACK); titleText.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); // CENTER ALIGNMENT return titleText; }

Estoy usando ToolBar en mi proyecto por primera vez, así que no sé cómo personalizar la barra de herramientas en Android. Necesito centrar el título en la barra de herramientas y cómo hacerlo, por favor dígame.

Gracias de antemano.


Basado en @LiuWenbin_NO,

Había creado una barra de herramientas personalizada, que no necesitaba ninguna vista adicional para centrar el título en la vista de texto,

import android.content.Context import android.util.AttributeSet import android.widget.TextView import androidx.appcompat.widget.Toolbar import android.view.Gravity class CenteredToolbar(context: Context, attrs: AttributeSet?, defStyleAttr: Int): Toolbar(context, attrs, defStyleAttr) { constructor(context: Context) : this(context, null, 0) constructor(context: Context, attrs: AttributeSet) : this(context, attrs, androidx.appcompat.R.attr.toolbarStyle) override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { super.onLayout(changed, l, t, r, b) val childCount = childCount for (i in 0 until childCount) { val view = this.getChildAt(i) if (view is TextView) { forceTitleCenter(view,l, r) break } } } /** * Centering the layout. * * @param view The view to be centered */ private fun forceTitleCenter(view: TextView, l: Int, r: Int) { val top = view.getTop() val bottom = view.getBottom() view.layout(l, top, r, bottom) navigationIcon?.let{ view.setPadding(it.intrinsicWidth,0,0,0) } view.gravity = Gravity.CENTER }

}

<ui.customView.CenteredToolbar android:id="@+id/apd_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:navigationIcon="@drawable/ic_search" app:title="Check Title" app:elevation="4dp"/>


Creo que esto funcionará.

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" android:theme="?attr/actionBarTheme" app:title="Title" app:titleMarginStart="155dp" app:titleTextColor="@android:color/white" />

cambie su tema base en values ​​/ styles.xml

Luego agregue su barra de herramientas manualmente de esta manera

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" android:theme="?attr/actionBarTheme" app:title="Title" app:titleMarginStart="155dp" app:titleTextColor="@android:color/white" />

Pero esto no es buena idea, esto no funciona bien.


Cuando tiene el botón Inicio o Arriba junto con el título centrado, y el título ya no está centrado y se mueve ligeramente hacia la derecha un poco, configure su vista de texto como ancho = wrap_content y layout_gravity = center

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/>


El problema con simplemente agregar un TextView en el centro alineado de la barra de herramientas es agregar elementos de menú en la barra de herramientas que compensarán el texto centrado.

Para evitar esto, he colocado el texto en la parte superior de la barra de herramientas, no dentro de ella. De esta manera, no importa cuántos iconos agregue, no compensará el texto centrado:

<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 esta manera, no hay necesidad de ninguna lógica adicional para compensar el espaciado de desplazamiento de los botones de retroceso / menú de desbordamiento / iconos de búsqueda, etc. en la barra de herramientas, porque el texto centrado está encima, no dentro.


La interfaz de usuario final se ve así: Para mi proyecto, tengo el icono de navegación a la izquierda y los menús (más de 1) a la derecha, y quiero poner el Título en el centro.

Tengo setSupportActionBar(toolbar) y _actionBar.setCustomView(R.layout.actionbar_filter); . Mi archivo de diseño:

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

Mi barra de herramientas extiende android.support.v7.widget.Toolbar, luego (tipo de código duro) mide el tamaño de RelativeLayout y finalmente lo distribuye en el centro 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); } }

Adjuntar mi diseño de barra de herramientas. Tal vez no necesites esto, solo estoy pegando aquí para referencia de alguien:

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


La mejor solución será usar un TextView anidado en la TextView de ToolBar luego establecer el layout_width y layout_height en wrap_content . Luego establezca layout_gravity en el center . De esta manera, no está compensado por otros íconos en la toolbar .


Modifiqué ligeramente la fuente de la Toolbar para alinear el centro del título.

public class CenterTitleToolbar extends Toolbar { private AppCompatTextView titleTextView; public CenterTitleToolbar(Context context) { super(context); } public CenterTitleToolbar(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public CenterTitleToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setTitle(CharSequence title) { if (!TextUtils.isEmpty(title)) { if (titleTextView == null) { final Context context = getContext(); titleTextView = new AppCompatTextView(context); titleTextView.setSingleLine(); titleTextView.setEllipsize(TextUtils.TruncateAt.END); titleTextView.setTextAppearance(context, R.style.TextAppearance_MaterialComponents_Headline6); final LayoutParams lp = generateDefaultLayoutParams(); lp.gravity = Gravity.CENTER; titleTextView.setLayoutParams(lp); } if (titleTextView.getParent() != this) { addSystemView(titleTextView); } } else if (titleTextView != null && titleTextView.getParent() == this) { removeView(titleTextView); } if (titleTextView != null) { titleTextView.setText(title); } } private void addSystemView(View v) { final ViewGroup.LayoutParams vlp = v.getLayoutParams(); final LayoutParams lp; if (vlp == null) { lp = generateDefaultLayoutParams(); } else if (!checkLayoutParams(vlp)) { lp = generateLayoutParams(vlp); } else { lp = (LayoutParams) vlp; } addView(v, lp); } }

Estilo de texto TextAppearance_MaterialComponents_Headline6 se incluye en la nueva biblioteca de materiales de Android .


No te entendí Pregunta completamente ... pero encontré una solución como esta

Para usar un título personalizado en su Barra de herramientas, todo lo que necesita hacer es recordar que la Barra de herramientas es solo un ViewGroup elegante para que pueda agregar un título personalizado como este:

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

Esto significa que puede diseñar TextView como desee, ya que es solo TextView normal. Entonces, en su actividad, puede acceder al título de la siguiente manera:

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


Puede forzar la barra de herramientas hacia el centro ajustando el título y nivelando el relleno derecho que tiene el relleno izquierdo predeterminado para el título. Luego, coloque el color de fondo en la barra de herramientas principal y de esa manera la parte que se corta envolviendo el título es del mismo color (blanco en mi ejemplo):

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


Recuerde que Toolbar es solo un ViewGroup como los demás. Para que pueda insertar View s en él. En su caso, necesita un TextView dentro de una 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>

Ahora, configure la Toolbar como su barra de acción recuperándola primero y luego usando setSupportActionBar() .

Como la gravedad de TextView se establece en el center , el texto debe estar centrado.


Siempre que la barra de herramientas sea un grupo de vista, puede crear diseños dentro de ella. Sigue estos pasos

1-Cree una vista de texto dentro de su Barra de herramientas 2-haga que su vista de texto sea el centro de gravedad

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


Simplemente poner otro TextView dentro de la Toolbar no es suficiente para centrar el título en relación con la pantalla, su posición dependerá de otros elementos en una barra de herramientas (botón de retroceso, elementos de menú).

Para centrar el título, puede establecer manualmente su posición:

Extienda la clase android.support.v7.widget.Toolbar y realice los siguientes cambios:

  1. agregar TextView
  2. anule onLayout() y configure la ubicación de TextView para centrarla ( titleView.setX((getWidth() - titleView.getWidth())/2) )
  3. reemplazar setTitle() donde establece el texto del título en una nueva vista de texto

public class CenteredToolbar extends Toolbar { 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); titleView = new TextView(getContext()); int textAppearanceStyleResId; TypedArray a = context.getTheme().obtainStyledAttributes(attrs, new int[] { android.support.v7.appcompat.R.attr.titleTextAppearance }, defStyleAttr, 0); try { textAppearanceStyleResId = a.getResourceId(0, 0); } finally { a.recycle(); } if (textAppearanceStyleResId > 0) { titleView.setTextAppearance(context, textAppearanceStyleResId); } addView(titleView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); titleView.setX((getWidth() - titleView.getWidth())/2); } @Override public void setTitle(CharSequence title) { titleView.setText(title); } }

En el diseño, puede usar esta clase de esta manera:

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

Además, para que el nuevo texto del título se vea como el título estándar, debe aplicar el estilo titleTextAppearance al nuevo TextView ( titleView.setTextAppearance(context, textAppearanceStyleResId) ).


ToolBar es un grupo de vista. para centrar, alinear el texto

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>

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

La actividad

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


Usar título personalizado (con centro de gravedad) dentro de la barra de herramientas

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


Uso simple contentInsertStart

SupportActionBar.Title = "title";


puedes insertar este código en tu código

name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"


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

Si también desea una fuente personalizada, consulte mi otra respuesta aquí: https://.com/a/35723158/445548