代码之家  ›  专栏  ›  技术社区  ›  Ponting

如何在默认主题(theme.Holo.Light)中将标题对齐在ActionBar的中心

  •  42
  • Ponting  · 技术社区  · 11 年前

    我搜索了很多,但找不到方法,我如何将标题设置在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.
    

    任何其他解决方案。。任何帮助都将不胜感激。

    12 回复  |  直到 11 年前
        1
  •  127
  •   Stefano Munarini    8 年前

    您可以创建一个自定义布局并将其应用于actionBar。

    要做到这一点,请遵循以下两个简单步骤:

    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 .

    此外,您还可以添加 标志 / 偶像 要做到这一点,只需添加 图片框 在布局中,并设置布局方向属性 android:orientation 水平(或者简单地使用RelativeLayout并自行管理)。

    要动态更改上述自定义操作栏的标题,请执行以下操作:

    TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName()));
    title.setText("Your Text Here");
    
        2
  •  8
  •   esentsov    11 年前

    如果没有自定义视图,似乎没有办法做到这一点。您可以获得标题视图:

    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);
    
        3
  •  7
  •   gotwo    5 年前

    查看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>
    
        4
  •  5
  •   Umar Ata    8 年前

    我知道我的回答不及时,但这纯粹是代码错误 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);
    }
    
        5
  •  4
  •   Darshan Khatri    7 年前

    如果您正在使用工具栏,则仅添加

    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>
    
        6
  •  3
  •   roscodex    9 年前

    这实际上是有效的:

     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>
    
        7
  •  1
  •   support_ms    11 年前

    我认为通过在操作栏上定位视图,你会得到你想要的。在操作栏的布局中,当布局参数设置为与父项匹配时,它与全宽不匹配 这就是为什么我在成功的地方以编程的方式完成了这项工作。通过设置宽度(它的工作原理类似于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; 
       }
    
        8
  •  1
  •   Amir    10 年前

    Java代码: 在onCreate()中写入
    getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setCustomView(R.layout.action_bar);

    对于您的自定义视图,只需使用FrameLayout,east peasy!
    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>
    
        9
  •  0
  •   Olivier Berni    9 年前

    我也遇到了同样的问题,由于工具栏中自动添加了“主页”按钮,我的文本没有准确输入。

    我用肮脏的方法把它修好了,但对我来说效果很好。我只是在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>
    
        10
  •  0
  •   tompadre    8 年前

    您可以通过换行标题和级别右填充来强制工具栏,该级别具有默认的标题左填充。然后将背景颜色放在工具栏的父级,这样通过包装标题剪切出来的部分就有了相同的颜色(在我的例子中是白色):

    <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>
    
        11
  •  0
  •   dmz9    7 年前

    解决方案基于以下内容:

    • 您需要使用自己的扩展Toolbar的类(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)
      }
    }
    

    可能的“副作用”——这也适用于“字幕”

        12
  •  0
  •   Princeps Polycap    5 年前

    经过两天的浏览,这就是我在科特林想到的。已测试并在我的应用程序上运行

      private fun setupActionBar() {
        supportActionBar?.apply {
            displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
            displayOptions = ActionBar.DISPLAY_SHOW_TITLE
            setDisplayShowCustomEnabled(true)
            title = ""
    
    
            val titleTextView = AppCompatTextView(this@MainActivity)
            titleTextView.text = getText(R.string.app_name)
            titleTextView.setSingleLine()
            titleTextView.textSize = 24f
            titleTextView.setTextColor(ContextCompat.getColor(this@MainActivity, R.color.appWhite))
    
            val layoutParams = ActionBar.LayoutParams(
                ActionBar.LayoutParams.WRAP_CONTENT,
                ActionBar.LayoutParams.WRAP_CONTENT
            )
            layoutParams.gravity = Gravity.CENTER
            setCustomView(titleTextView, layoutParams)
    
            setBackgroundDrawable(
                ColorDrawable(
                    ContextCompat.getColor(
                        this@MainActivity,
                        R.color.appDarkBlue
                    )
                )
            )
    
        }
    }