【问题标题】:Center Action bar title中心操作栏标题
【发布时间】:2026-02-06 10:30:01
【问题描述】:

如何在 Android 中将活动的操作栏标题居中?

我已经看到很多关于这个特定主题的问题。每个答案都回到“使用自定义视图”并拥有自己的工具栏。

我找到了一个无需创建自定义视图即可工作的解决方案。

【问题讨论】:

    标签: android android-actionbar android-titlebar


    【解决方案1】:

    在你的Activity中有这个方法:

    private void centerTitle() {
        ArrayList<View> textViews = new ArrayList<>();
    
        getWindow().getDecorView().findViewsWithText(textViews, getTitle(), View.FIND_VIEWS_WITH_TEXT);
    
        if(textViews.size() > 0) {
            AppCompatTextView appCompatTextView = null;
            if(textViews.size() == 1) {
                appCompatTextView = (AppCompatTextView) textViews.get(0);
            } else {
                for(View v : textViews) {
                    if(v.getParent() instanceof Toolbar) {
                        appCompatTextView = (AppCompatTextView) v;
                        break;
                    }
                }
            }
    
            if(appCompatTextView != null) {
                ViewGroup.LayoutParams params = appCompatTextView.getLayoutParams();
                params.width = ViewGroup.LayoutParams.MATCH_PARENT;
                appCompatTextView.setLayoutParams(params);
                appCompatTextView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
            }
        }
    }
    

    然后,只需在您的onCreate() 中调用它:

    centerTitle();
    

    就是这样!!!

    【讨论】:

    • 因为您必须自己实现菜单、样式(颜色、主题)。这样,您的原色和所有其他标准操作栏功能仍然存在
    • 我不确定您的意思,但是使用 AppBarLayout 和居中的 TextView,您仍然可以得到您提到的所有内容
    【解决方案2】:

    在 Kotlin 你可以这样做:

    private fun centerTitle() {
            val textViews = ArrayList<View>()
            window.decorView.findViewsWithText(textViews, title, View.FIND_VIEWS_WITH_TEXT)
            if (textViews.size > 0) {
                var appCompatTextView: AppCompatTextView? = null
                if (textViews.size == 1)
                    appCompatTextView = textViews[0] as AppCompatTextView
                else {
                    for (v in textViews) {
                        if (v.parent is Toolbar) {
                            appCompatTextView = v as AppCompatTextView
                            break
                        }
                    }
                }
                if (appCompatTextView != null) {
                    val params = appCompatTextView.layoutParams
                    params.width = ViewGroup.LayoutParams.MATCH_PARENT
                    appCompatTextView.layoutParams = params
                    appCompatTextView.textAlignment = View.TEXT_ALIGNMENT_CENTER
                }
            }
        }
    

    并在您的onCreate() 中调用centerTitle()

    【讨论】:

      【解决方案3】:

      您可以使用此解决方案。但它不会忽略工具栏中的其他元素。

      fun setToolbarTextAlignment(textAlignment: Int) {
          for (i in 0..toolbarView.childCount) {
              (toolbarView.getChildAt(i) as? TextView)?.let {
                  it.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
                  it.textAlignment = textAlignment
              }
          }
      }
      

      【讨论】:

        【解决方案4】:
         <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="?attr/colorPrimary"
                    app:popupTheme="@style/AppTheme.PopupOverlay" >
        
                  <TextView
                      android:layout_width="match_parent"
                      android:layout_height="match_parent" 
                      android:gravity="center"
                      android:text="haiii"/>
         </android.support.v7.widget.Toolbar>
        

        【讨论】: