Как выровнять название в центре 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 в более ранних версиях sdk?
- Как изменить значок меню в панели действий?
- Значок приложения не отображается на панели действий.
- Внедрение SearchView в панели действий
- getActionBar возвращает null
- Каков размер ActionBar в пикселях?
- Как сместить ActionBar вместе с NavigationDrawer
- Android - кнопка переключения ActionBar Back на навигационную кнопку
- ProgressBar в панели действий
- Android: как скрыть ActionBar при определенных действиях
- Как получить высоту ActionBar?
- Создание экрана предпочтений с поддержкой (v21) Панели инструментов
- Как настроить цвет и текст режима действия?
Вы можете создать собственный макет и применить его к actionBar.
Для этого выполните следующие два простых шага:
-
Код Java
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setCustomView(R.layout.actionbar);
Где R.layout.actionbar
– следующий макет.
-
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) } }
возможные «побочные эффекты» – это относится также к «субтитрам»