android - studio - Cómo alinear el título en el centro de ActionBar en el tema predeterminado(Theme.Holo.Light)
custom toolbar android (11)
Busqué mucho pero no puedo encontrar la manera. ¿Cómo puedo establecer el título en el centro de ActionBar en lugar de alineado a la izquierda? Usé el código siguiente para establecer el título en el centro:
ViewGroup decorView= (ViewGroup) this.getWindow().getDecorView();
LinearLayout root= (LinearLayout) decorView.getChildAt(0);
FrameLayout titleContainer= (FrameLayout) root.getChildAt(0);
TextView title= (TextView) titleContainer.getChildAt(0);
title.setGravity(Gravity.CENTER);
Pero da error como a continuación:
ClassCastException : com.android.internal.widget.ActionBarView can not
be cast to android.widget.TextView.
Cualquier otra solución ... Cualquier ayuda será apreciada.
Código Java: escriba esto en onCreate ()
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(R.layout.action_bar);
y para su vista personalizada, simplemente use FrameLayout, east peasy!
android.support.v7.widget.Toolbar es otra opción
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center_vertical"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/app_name"
android:textColor="@color/black"
android:id="@+id/textView" />
</FrameLayout>
Creo que al posicionar las vistas en la barra de acciones alcanzará lo que desee. En el diseño de la barra de acciones cuando los parámetros de diseño se establecen para que coincidan con los padres, no coincide con el ancho completo, por eso lo hice programáticamente donde tengo éxito.Por ancho de configuración (funciona como layout_weight = "valor") podemos establecer nuestra vista donde queramos:
actionBar = getSupportActionBar();
actionBar.setDisplayShowCustomEnabled(true);
LayoutInflater ll = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout linearLayout = (LinearLayout) ll.inflate(R.layout.custom_actionbar, null);
//inner layout within above linear layout
LinearLayout inner = (LinearLayout) linearLayout.findViewById(R.id.inner_linear_ractionbar);
inner.setMinimumWidth(getWidth() * 2 / 10);
// we will set our textview to center and display there some text
TextView t = (TextView) linearLayout.findViewById(R.id.center_text);
t.setWidth(getWidth() * 6 / 10);
Button b = (Button) linearLayout.findViewById(R.id.edit_button);
b.setWidth(getWidth() *3/ 20);
ImageButton imageButton = (ImageButton) linearLayout.findViewById(R.id.action_bar_delete_item);
imageButton.setMinimumWidth(deviceUtils.getWidth() / 20);
y aquí está el método getWidth ():
public int getWidth() {
DisplayMetrics dm = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
Echa un vistazo a la nueva barra de herramientas en la clase de biblioteca de soporte en la actualización de Lollipop. Puedes diseñar una barra de acciones agregando una barra de herramientas en tu diseño.
agregue estos elementos en el tema de su aplicación
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
Crea tu barra de herramientas en un diseño e incluye tu vista de texto en el diseño del centro de tu barra de herramientas
<android.support.v7.widget.Toolbar
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="@color/acbarcolor">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/app_name"
android:textColor="#ffffff"
android:textStyle="bold" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
agrega tu barra de acciones como barra de herramientas
toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
asegúrese de que necesita incluir la barra de herramientas en su archivo de recursos como este
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/toolbar" />
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/homepageinc" />
</FrameLayout>
<fragment
android:id="@+id/fragment1"
android:layout_gravity="start"
android:name="com.shouldeye.homepages.HomeFragment"
android:layout_width="250dp"
android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
Esto realmente funciona:
getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getActionBar().setCustomView(R.layout.custom_actionbar);
ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
p.gravity = Gravity.CENTER;
Debe definir el diseño custom_actionbar.xml, que es según su requisito, por ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#2e2e2e"
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/top_banner"
android:layout_gravity="center"
/>
</LinearLayout>
Parece que no hay forma de hacer esto sin una vista personalizada. Puede obtener la vista de título:
View decor = getWindow().getDecorView();
TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "android"));
Pero el cambio de gravity
o la layout_gravity
no tiene ningún efecto. El problema en ActionBarView
, que distribuye sus elementos ActionBarView
por sí mismo, por lo que cambiar los parámetros de diseño de sus elementos secundarios tampoco tiene ningún efecto. Para ver este excelente código siguiente:
ViewGroup actionBar = (ViewGroup) decor.findViewById(getResources().getIdentifier("action_bar", "id", "android"));
View v = actionBar.getChildAt(0);
ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
p.gravity= Gravity.CENTER;
v.setLayoutParams(p);
v.setBackgroundColor(Color.BLACK);
Puede crear un diseño personalizado y aplicarlo a la barra de acciones.
Para hacerlo, sigue esos 2 sencillos pasos:
Código Java
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setCustomView(R.layout.actionbar);
Donde R.layout.actionbar
es el siguiente diseño.
XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/action_bar_title" android:text="YOUR ACTIVITY TITLE" android:textColor="#ffffff" android:textSize="24sp" /> </LinearLayout>
Puede ser tan complejo como quieras. ¡Pruébalo!
EDITAR:
Para establecer el background
puede usar la propiedad android:background
en el diseño del contenedor (LinearLayout en ese caso). Es posible que deba establecer la altura de diseño android:layout_height
para match_parent
lugar de wrap_content
.
Además, también puede agregarle un LOGO / ICONO . Para hacerlo, simplemente agregue un ImageView dentro de su diseño, y configure la propiedad de orientación de diseño android:orientation
en horizontal (o simplemente use un RelativeLayout y administrelo usted mismo).
Para cambiar dinámicamente el título de la barra de acción personalizada anterior, haga lo siguiente:
TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName()));
title.setText("Your Text Here");
Puede forzar la barra de herramientas al envolver el título y nivelar el relleno a la derecha que tiene relleno izquierdo predeterminado para el título. Luego coloque el color de fondo en el elemento primario de la barra de herramientas y de esa manera la parte que se recorta al envolver el título tiene el 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>
Sé que mi respuesta no es a tiempo, pero esto es puramente código no xml
requerido.
Esto es para usar en Activity
public void setTitle(String title){
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
TextView textView = new TextView(this);
textView.setText(title);
textView.setTextSize(20);
textView.setTypeface(null, Typeface.BOLD);
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView.setGravity(Gravity.CENTER);
textView.setTextColor(getResources().getColor(R.color.white));
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(textView);
}
Esto es para usar en Fragment
public void setTitle(String title){
((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
TextView textView = new TextView(getActivity());
textView.setText(title);
textView.setTextSize(20);
textView.setTypeface(null, Typeface.BOLD);
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView.setGravity(Gravity.CENTER);
textView.setTextColor(getResources().getColor(R.color.white));
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(textView);
}
Tuve el mismo problema, y debido a que el botón "Inicio" se agregó automáticamente en la barra de herramientas, mi texto no se ingresó exactamente.
Lo arreglé de una manera sucia, pero funciona bien en mi caso. Simplemente agregué un margen a la derecha de mi TextView para compensar el botón de inicio de la izquierda. Aquí está mi diseño de la barra de herramientas:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:elevation="1dp"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
android:gravity="center"
android:background="@color/mainBackgroundColor"
android:fitsSystemWindows="true" >
<com.lunabee.common.utils.LunabeeShadowTextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="?attr/actionBarSize"
android:gravity="center"
style="@style/navigation.toolbar.title" />
</android.support.v7.widget.Toolbar>
la solución se basa en estas cosas:
- necesita usar su propia clase que extiende la barra de herramientas (support.v7.widget.toolbar)
- debe sobrescribir un método Barra de herramientas # addView
Qué hace:
cuando la barra de herramientas de la primera vez ejecuta #setTitle, crea AppCompatTextView y lo usa para mostrar el texto del título.
cuando se crea AppCompatTextView, la barra de herramientas (como ViewGroup), la agrega a su propia jerarquía con el método #addView.
Además, al tratar de encontrar la solución noté que la vista de texto tiene el ancho de diseño establecido en "wrap_content", así que decidí hacer que "match_parent" y asignar la alineación de texto a "center".
MyToolbar.kt, omitiendo cosas no relacionadas (constructores / importaciones):
class MyToolbar : Toolbar {
override fun addView(child: View, params: ViewGroup.LayoutParams) {
if (child is TextView) {
params.width = ViewGroup.LayoutParams.MATCH_PARENT
child.textAlignment= View.TEXT_ALIGNMENT_CENTER
}
super.addView(child, params)
}
}
posibles "efectos secundarios": esto también se aplicará a "subtítulos"
si está utilizando la barra de herramientas, simplemente agregue
android:layout_gravity="center_horizontal"
Debajo de la barra de herramientas Al igual que este fragmento
<android.support.design.widget.AppBarLayout
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="@color/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" //Important
android:textColor="@color/whitecolor"
android:textSize="20sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>