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:
-
agregar
TextView
-
anule
onLayout()
y configure la ubicación deTextView
para centrarla (titleView.setX((getWidth() - titleView.getWidth())/2)
) -
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