关于Toolbar的使用网上有很多教程,使用中每个Activity都要至少加上这两行代码
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
这还是次要的,万一那一场产品经理让你修改一下Toolbar,咋办,不改!!!(貌似不行),改吧(好多Activity,猴年马月),针对以上情况有必要统一写一下Toolbar,方便管理和使用。
BaseActivity代码
public abstract class BaseActivity extends AppCompatActivity implements Toolbar.OnMenuItemClickListener {
protected Toolbar toolbar;
protected TextView toolbar_title;
//针对不同的情况,有些界面可能用不到back
public static final int MODE_BACK = 0; //需要带返回键
public static final int MODE_DRAWER = 1; //带侧拉抽屉
public static final int MODE_NONE = 2;//不用Toolbar
public static final int MODE_HOME = 3;//主页面
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpContentView();//绑定布局
setUpView();//绑定view
setUpData(savedInstanceState);//赋值
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
setContentView(layoutResID, -1, -1, MODE_BACK);
}
//这里用到方法的重载,针对不同情况进行处理
public void setContentView(int layoutResID, int titleResId) {
setContentView(layoutResID, titleResId, -1, MODE_BACK);
}
public void setContentView(int layoutResID, int titleResId, int mode) {
setContentView(layoutResID, titleResId, -1, MODE_BACK);
}
public void setContentView(int layoutResID, int titleResId, int menuId, int mode) {
super.setContentView(layoutResID);
setUpToolbar(titleResId, menuId, mode);
}
private void setUpToolbar(int titleResId, int menuId, int mode) {
if (mode != MODE_NONE) { //判读需不需要toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
toolbar_title = (TextView) findViewById(R.id.toolbar_title);
if (mode == MODE_BACK) { //需要返回键 设置图片样式
toolbar.setNavigationIcon(R.mipmap.nav_backarrow);
}
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onNavigationOnClicked(); //为什么这里不直接写finis(); ---往下走
}
});
//toolbar_title 赋值
setUpTitle(titleResId);
//menu赋值
setUpMenu(menuId);
}
}
protected void setUpMenu(int menuId) {
if (toolbar != null) {
toolbar.getMenu().clear();
if (menuId > 0) {
toolbar.inflateMenu(menuId);
toolbar.setOnMenuItemClickListener(this);
}
}
}
protected void setUpTitle(int titleResId) {
if (titleResId > 0 && toolbar_title != null) {
toolbar_title.setText(titleResId);
}
}
// protected 只有子类可以重写这个方法 ,万一点击返回键不是finishi()呢,子类重写这个方法即可
protected void onNavigationOnClicked() {
finish();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
protected abstract void setUpContentView();
protected abstract void setUpView();
protected abstract void setUpData(Bundle savedInstanceState);
}
widget_toolbar.xml
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/ToolBarStyle">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="20sp" />
</android.support.v7.widget.Toolbar>
style 有几个需要注意的点
<style name="ToolBarStyle">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">?attr/actionBarSize</item>
<item name="android:background">?attr/colorPrimary</item>
<item name="android:windowBackground">@color/white</item>
<item name="android:theme">@style/windowStyle</item>
关于style的配置项目来进行配置
</style>
<!-- app主题设置成NoActionBar需要注意 -->
<style name="windowStyle" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<!-- Menu弹框背景颜色 -->
<item name="android:colorBackground">@color/grey</item>
<!-- Menu菜单按钮和item里面文字的颜色 -->
<item name="android:textColorPrimary">@color/white</item>
<!-- 是否覆盖锚点,默认为true,即盖住Toolbar -->
<item name="overlapAnchor">false</item>
</style>
Activity
3种布局3行代码(敢说不简单???)
setContentView(R.layout.activity_test1, R.string.test1);//带Back不带menu
setContentView(R.layout.activity_test1, R.string.test1,R.menu.search);//带back 带menu
setContentView(R.layout.activity_test1, R.string.test1,MODE_HOME);//只有textview(主界面)