Cómo alinear el título en el centro de ActionBar en el tema predeterminado (Theme.Holo.Light)

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.

    Puede crear un diseño personalizado y aplicarlo a la barra de acciones.

    Para hacerlo, sigue esos 2 sencillos pasos:

    1. Código Java

       getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setCustomView(R.layout.actionbar); 

    Donde R.layout.actionbar es el siguiente diseño.

    1. XML

       < ?xml version="1.0" encoding="utf-8"?>    

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

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

    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

      true false 

    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

          

    agrega tu barra de acciones como barra de herramientas

      toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } 

    por favor, asegúrese de que necesita incluir la barra de herramientas en su archivo de recursos como este

     < ?xml version="1.0" encoding="utf-8"?>           

    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

           

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

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

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

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

    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:

        

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

        

    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”