先來了解常規的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