Toolbar居中是困擾我很長一段時間的問題,主要是Toolbar默認不是水平居中,這種居中還是挺好看的(支付寶就是偏左,的確很好看),但是我UI太爛,所以不居中感覺很難受
第一種
1、佈局添加TextView
<?xml version="1.0" encoding="utf-8"?>
<!--AppBarLayout主要用來實現標題摺疊功能elevation:陰影高度-->
<com.google.android.material.appbar.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
android:elevation="0dp">
<!--Toolbar控件-->
<androidx.appcompat.widget.Toolbar
android:background="@color/blue"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay" >
<TextView
android:textSize="20sp"
android:textColor="@android:color/white"
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
2、獲取控件設置標題
//設置TextView的內容
toolbar_title.setText(title);
//暴力清空toolbar的默認標題,不設置的話會默認顯示application的label屬性值
toolbar.setTitle("");
第二種
通過獲取Toolbar的標題子控件,設置子控件的對齊方式設置Toolbar居中
xml佈局
<com.google.android.material.appbar.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
android:elevation="0dp">
<!--Toolbar控件-->
<androidx.appcompat.widget.Toolbar
app:collapsedTitleGravity="center"
app:contentInsetStart="0dp"
app:contentInsetLeft="0dp"
app:titleMargin="0dp"
android:background="@color/blue"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay" >
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
/***
* 設置Toolbar標題居中
*/
public void setToolbarTitleCenter() {
String title = "title";
final CharSequence originalTitle = toolbar.getTitle();
toolbar.setTitle(title);
for (int i = 0; i < toolbar.getChildCount(); i++) {
View view = toolbar.getChildAt(i);
if (view instanceof TextView) {
TextView textView = (TextView) view;
if (title.equals(textView.getText())) {
textView.setGravity(Gravity.CENTER);
Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.CENTER;
textView.setLayoutParams(params);
}
}
toolbar.setTitle(originalTitle);
}
}
我還是喜歡第二種,但是兩種都能實現。我喜歡第二種的原因是可以直接在Mainfests中設置活動的名稱,需要居中的活動繼承基礎活動就可以實現居中效果,很方便,而如果採用第二種方式,繼承自基礎活動的活動還需要傳值或者調用對象方法。