先来了解常规的Toolbar设置标题居中的方法,通常是在布局文件套多一个Textview来解决:java
<android.support.v7.widget.Toolbar android:id="@+id/toolbar_top" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="@color/action_bar_bkgnd" app:theme="@style/ToolBarTheme" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Toolbar Title" android:layout_gravity="center" android:id="@+id/toolbar_title" /> </android.support.v7.widget.Toolbar> 复制代码
这种实现方法改变了原来经过activity.setTitle('标题')
就能够轻松设置的途径,则须要另外修改设置标题的方法来实现。今天来研究一下如何在不修改原来的Toolbar定义的调用方法来实现标题居中。android
经过阅读源码发现,其实Toolbar
是经过添个子View
来布局的,在字段里面就定义了很明显了:markdown
public class Toolbar extends ViewGroup { private static final String TAG = "Toolbar"; private ActionMenuView mMenuView; private TextView mTitleTextView; private TextView mSubtitleTextView; private ImageButton mNavButtonView; private ImageView mLogoView; private Drawable mCollapseIcon; // ... 省略其余代码 } 复制代码
这一看,我们思路很清晰了,接下就是拿到标题的View来改变布局参数就行,在activity.setSupportActionBar()
以后咱们进行如下处理:app
protected void onCreate(@Nullable Bundle savedInstanceState) { // ...省略其余代码 setSupportActionBar(mToolbar); // 设置标题居中 int childCount = mToolbar.getChildCount(); for (int i = 0; i < childCount; i++) { View view = mToolbar.getChildAt(i); // 拿到导航按钮(也叫返回按钮) if (view instanceof ImageButton) { // 布局发生改变的时候拿到导航的宽度 // 由于标题设置居中的时候会偏向右边 view.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { if (mTitleView != null) { // 把标题的右边也进行一个padding 导航的宽度,让标题显得在整个屏幕中间 mTitleView.setPadding(0, 0, v.getWidth(), 0); } }); } // 找到标题的View if (view instanceof TextView) { mTitleView = (TextView) view; // 设置居中 mTitleView.setGravity(Gravity.CENTER); mTitleView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; break; } } } 复制代码
最后看看咱们的布局边界:布局
关掉布局边界:spa
发现了吧,是个横向布局,若是标题没有加多一个right padding
的话整个标题会偏向右边。code
OK,到这里结束了。orm