Как выровнять название в центре ActionBar в теме по умолчанию (Theme.Holo.Light)

Я много искал, но не могу найти способ. Как установить заголовок в центре ActionBar вместо выравнивания по левому краю. Я использовал ниже код, чтобы установить название в центре:

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

Но это дает ошибку, как показано ниже:

 ClassCastException : com.android.internal.widget.ActionBarView can not be cast to android.widget.TextView. 

Любое другое решение. Любая помощь будет оценена.

Вы можете создать собственный макет и применить его к actionBar.

Для этого выполните следующие два простых шага:

  1. Код Java

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

Где R.layout.actionbar – следующий макет.

  1. XML

         

Это может быть так сложно, как вы хотите. Попробуйте!

РЕДАКТИРОВАТЬ:

Чтобы установить background вы можете использовать свойство android:background в макете контейнера (LinearLayout в этом случае). Возможно, вам нужно будет установить высоту android:layout_height layout android:layout_height для match_parent вместо wrap_content .

Кроме того, вы можете добавить к нему LOGO / ICON . Для этого просто добавьте ImageView внутри своего макета и задайте свойство ориентации ориентации android:orientation по горизонтали (или просто используйте RelativeLayout и управляйте им самостоятельно).

Чтобы динамически изменить название выше настраиваемой панели действий, выполните следующие действия:

 TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName())); title.setText("Your Text Here"); 

Кажется, что нет никакого способа сделать это без специального вида. Вы можете получить название:

 View decor = getWindow().getDecorView(); TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "android")); 

Но изменение gravity или layout_gravity не имеет эффекта. Проблема в ActionBarView , которая сама ActionBarView свои дети, так что изменение параметров макета его детей также не имеет эффекта. Чтобы увидеть этот excecute следующий код:

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

Проверьте новую панель инструментов в classе библиотеки поддержки в обновлении Lollipop, вы можете создать панель действий, добавив панель инструментов в свой макет

добавьте эти элементы в тему приложения

  true false 

Создайте свою панель инструментов в макете и включите текст в центре дизайна своей панели инструментов

      

добавьте панель действий в качестве панели инструментов

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

убедитесь, что вам нужно включить панель инструментов в свой файл ресурсов, как это

            

если вы используете панель инструментов, просто добавьте

android:layout_gravity="center_horizontal"

Под панелью инструментов Так же, как этот fragment

       

Это действительно работает:

  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; 

Вы должны определить макет custom_actionbar.xml, который соответствует вашему требованию, например:

     

Я знаю, что мой ответ не вовремя, но это чисто код, не требуемый xml .
Это используется для 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); } 

Это используется для 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); } 

Я думаю, позиционируя взгляды на панели действий, вы достигнете того, что хотите. На масках панели действий, когда параметры макета установлены в соответствии с родительским, он не соответствует полной ширине, поэтому я сделал это программно, где мне удалось. Ширина настройки (она работает как layout_weight = “value”), мы можем установить наш вид везде, где хотим:

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

и вот метод getWidth ():

  public int getWidth() { DisplayMetrics dm = new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm); return dm.widthPixels; } 

Код Java: напишите это в onCreate ()
getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setCustomView(R.layout.action_bar);

и для вас пользовательский вид, просто используйте FrameLayout, восточный peasy!
android.support.v7.widget.Toolbar – еще один вариант

     

У меня была та же проблема, и из-за кнопки «Главная», автоматически добавленной на панели инструментов, мой текст не был точно введен.

Я исправил его грязным способом, но он хорошо работает в моем случае. Я просто добавил поле справа от своего TextView, чтобы компенсировать кнопку home слева. Вот мой макет панели инструментов:

    1    

Вы можете заставить панель инструментов обернуть заголовок заголовка и уровня справа, который по умолчанию оставил дополнение для заголовка. Чем цвет фона для родителя панели инструментов, и эта часть, которая вырезана путем обертывания заголовка, имеет тот же цвет (белый в моем примере):

    

решение основано на следующих вещах:

  • вам нужно использовать свой собственный class, который расширяет панель инструментов (support.v7.widget.toolbar)
  • вам нужно переопределить один метод Панель инструментов # addView

Что это делает:

когда первая панель инструментов запускает #setTitle, она создает AppCompatTextView и использует ее для отображения текста заголовка.

когда создается AppCompatTextView, панель инструментов (как ViewGroup) добавляет ее в свою собственную иерархию с помощью метода #addView.

также, пытаясь найти решение, я заметил, что textview имеет ширину макета, установленную на «wrap_content», поэтому я решил сделать ее «match_parent» и присвоить textalignment «center».

MyToolbar.kt, пропуская несвязанные вещи (конструкторы / импорт):

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

возможные «побочные эффекты» – это относится также к «субтитрам»

Давайте будем гением компьютера.