it-swarm.com.ru

Как выровнять заголовок в центре 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.

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

41
Ponting

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

Для этого выполните эти 2 простых шага:

  1. Java-код

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

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

  1. 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>
    

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

Правка:

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

Кроме того, вы также можете добавитьЛОГОТИП/ЗНАЧОКк нему. Для этого просто добавьте ImageView внутри макета и установите свойство ориентации макета Android:orientation в горизонтальное положение (или просто используйте RelativeLayout и управляйте им самостоятельно).

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

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

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

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

 <item name="Android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>

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

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

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

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

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

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

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

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

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

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

Я знаю, что мой ответ не вовремя, но это просто код, не 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);
}
4
Umar Ata

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

Android:layout_gravity="center_horizontal"

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

 <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>
3
Darshan Khatri

Это на самом деле работает:

 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 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>
2
Roshan Ramtel

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

и для пользовательского просмотра, просто используйте FrameLayout, Восточный Писи!
Android.support.v7.widget.Toolbar - еще один вариант

<?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>
1
Amir

Я думаю, что, размещая представления на панели действий, вы достигнете желаемого. На макете панели действий, когда параметры макета соответствуют родительскому, он не соответствует полной ширине Поэтому я сделал это программно там, где мне это удалось. Установив ширину ( работает как 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; 
   }
1
support_ms

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

<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>
0
tompadre

решение основано на этих вещах:

  • вам нужно использовать свой собственный класс, расширяющий панель инструментов (support.v7.widget.toolbar) 
  • вам нужно переопределить один метод 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)
  }
}

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

0
dmz9

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

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

<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>
0
Olivier Berni