引言
你们还在用自定义标题栏吗,你们还在为actionbar标题不能居中不灵活苦恼吗,Toolbar一切问题都帮你搞定
- Toolbar 标题居中
- 封装Toolbar的基类
Toolbar 标题居中
Toolbar的标题是默认左对齐的,不过Toolbar继承于ViewGroup,直接布局中添加一个textView 居中显示就可以搞定
layout_toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar">
<TextView
android:id="@+id/mToolBarTitleLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
编写带有Toolbar的基类
1.包含一个toolbar控件
2.toolbar控件的资源id固定好 以便父类找到
3.将toolbar绑定到AppCompatActivity(兼容低版本的活动)
以上三点设置好之后 子类就可以按照actionbar的方式去使用toolbar,轻松替换actionbar
此外父类还提供了一个带有toolbar的模版布局,因此你可以直接写内容布局,无需进行额外的toolbar引用操作
基类
package com.cjia.toolbar;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* Created by qinwei on 16/7/7 下午4:45
*/
public abstract class BaseActivity extends AppCompatActivity {
protected String TAG = this.getClass().getSimpleName();
protected Toolbar toolbar;
protected TextView mToolBarTitleLabel;
@Override
protected void onCreate(Bundle saveInstance) {
super.onCreate(saveInstance);
setContentView();
initializeView();
initializeData(saveInstance);
}
/**
* 1. 设置布局
*/
protected abstract void setContentView();
/**
* 2. 初始化布局
*/
protected void initializeView() {
if (findViewById(R.id.toolbar) != null) {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (hasBackIcon()) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
if (isCenter()) {
mToolBarTitleLabel = (TextView) findViewById(R.id.mToolBarTitleLabel);
}
}
}
/**
* 3. 初始化ui数据
*/
protected abstract void initializeData(Bundle saveInstance);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finishActivity();
}
return super.onOptionsItemSelected(item);
}
public void finishActivity() {
finish();
}
/**
* 是否有回退功能
*
* @return
*/
protected boolean hasBackIcon() {
return true;
}
protected boolean isCenter() {
return false;
}
/**
* 重写父类的setTitle方法根据当前标题显示是否居中做相应处理
* @param title
*/
@Override
public void setTitle(CharSequence title) {
if (mToolBarTitleLabel != null && isCenter()) {
mToolBarTitleLabel.setText(title);
super.setTitle("");
} else {
super.setTitle(title);
}
}
public void setContentView(int layoutId) {
setContentView(layoutId, true);
}
/**
* 容器模版
* @param layoutId 内容视图
* @param isContainerTitle true 带有toolbar的布局容器 false无toolbar 你可以自定义标题实现复杂的title
*/
protected void setContentView(int layoutId, boolean isContainerTitle) {
if (isContainerTitle) {
LinearLayout root = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.layout_content, null);
LayoutInflater.from(this).inflate(layoutId, root);
super.setContentView(root);
} else {
super.setContentView(layoutId);
}
}
}
子类
package com.cjia.toolbar;
import android.os.Bundle;
public class MainActivity extends BaseActivity {
@Override
protected void setContentView() {
setContentView(R.layout.activity_main);
}
@Override
protected void initializeData(Bundle saveInstance) {
setTitle("标题居中啦");
}
@Override
protected boolean isCenter() {
return true;
}
@Override
protected boolean hasBackIcon() {
return false;
}
}
布局资源文件
模版容器layout_content.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar">
<TextView
android:id="@+id/mToolBarTitleLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
</LinearLayout>
视图内容activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.cjia.toolbar.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello toolbar!" />
</RelativeLayout>
注意:
跟AppCompatActivity一起绑定时不要忘了配置主题样式
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
效果图