Toolbar 設置標題居中的另一種方法

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

相關文章
相關標籤/搜索