Android 自定义ToolBar详细使用
自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用
1.ToolBar布局
<?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"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="@color/color_bg_toolbar">
<ImageView
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:visibility="gone"
android:src="@mipmap/ic_back"/>
<TextView
android:id="@+id/title_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
android:textColor="@color/color_bg_write"
android:text="@string/app_name"/>
<TextView
android:id="@+id/title_rightTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_marginRight="10dp"
android:layout_gravity="right"
android:textColor="@color/color_bg_write"
android:text="@string/app_name"
android:visibility="gone"/>
</android.support.v7.widget.Toolbar>
2.menu文件(title右侧图标,测试发现最多只能显示三个,如果超过三个第三个会变成更多的选项),另一种方式就是像上边那样在xml布局里写在Toolbar标签里
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--扫描-->
<item android:id="@+id/title_scan" //id
android:title="@string/scan" //title长按显示的文字
android:visible="false" //默认全部不显示
android:icon="@mipmap/ic_scan" //图标
app:showAsAction="ifRoom"/>
<!--添加-->
<item android:id="@+id/title_add"
android:title="@string/add"
android:icon="@mipmap/ic_add"
app:showAsAction="ifRoom"/>
<!--设置-->
<item android:id="@+id/title_setting"
android:title="@string/setting"
android:visible="false"
android:icon="@mipmap/ic_setting"
app:showAsAction="ifRoom"/>
<!--搜索-->
<item android:id="@+id/title_search"
android:title="@string/search"
android:visible="false"
android:icon="@mipmap/ic_search"
app:showAsAction="ifRoom"/>
<!--日期-->
<item android:id="@+id/title_date"
android:title="@string/date"
android:visible="false"
android:icon="@mipmap/ic_calendar"
app:showAsAction="ifRoom"/>
<!--刷新-->
<item android:id="@+id/title_refresh"
android:title="@string/refresh"
android:visible="false"
android:icon="@mipmap/botton_refresh"
app:showAsAction="ifRoom"/>
<!--<item android:id="@+id/title_more1"-->
<!--android:title="@string/right2"-->
<!--app:showAsAction="never"/>-->
<!--<item android:id="@+id/title_more2"-->
<!--android:title="@string/right2"-->
<!--app:showAsAction="never"/>-->
</menu>
3.BaseActivity
/**
* Created by Administrator on 2016/9/5 0005.
*/
public class BaseActivity extends AppCompatActivity implements View.OnClickListener, Toolbar.OnMenuItemClickListener {
/*Toolbar*/
private Toolbar toolBar;
/**/
private CoordinatorLayout coordinatorLayout;
/*是否第一次加载图标(主要针对首页一对多fragment)*/
private boolean title_menu_first = true;
/*是否第一次加载返回*/
private boolean title_back_first = true;
/*是否是返回(有可能是代表别的功能)*/
private boolean is_title_back = true;
/*返回*/
private ImageView titleBack;
/*标题名称*/
private TextView titleName;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRootView();
// coordinatorLayout = getView(R.id.coordinatorLayout);
initToolbar();
initWidght();
}
protected void setRootView(){}
protected void initWidght(){};
//
protected <T extends View>T getView(int resourcesId){
return (T) findViewById(resourcesId);
}/*初始化toolbar*/
private void initToolbar(){
toolBar = getView(R.id.toolbar);
toolBar.setTitle("");
toolBar.setTitleTextColor(Color.WHITE);
titleName = getView(R.id.title_name);
// setSupportActionBar(toolBar);
}
/**
* 设置返回
* @param back :是否返回:是-->返回,不是则设置其他图标
* @param resourcesId :图标id,返回时随意设置,不使用
* */
protected void setTitleBack(final boolean back,int resourcesId){
is_title_back = back;
if (title_back_first || titleBack == null){
titleBack= getView(R.id.title_back);
titleBack.setOnClickListener(this);
title_back_first = false;
}
titleBack.setVisibility(View.VISIBLE);
if (!back){
titleBack.setImageResource(resourcesId);
}
}
/**
* 设置title
* @param title :title
* */
protected void setTitleName(String title){
titleName.setText(title);
}
/**
* title右侧:图标类
* */
protected void setRightRes(){
//扩展menu
toolBar.inflateMenu(R.menu.base_toolbar_menu);
//添加监听
toolBar.setOnMenuItemClickListener(this);
}
/**
* 显示title图标
* @param itemId :itemId :图标对应的选项id(1个到3个),最多显示3两个
* */
protected void showTitleRes(int... itemId){
if (title_menu_first){
setRightRes();
title_menu_first = false;
}
for (int item:itemId){
//显示
toolBar.getMenu().findItem(item).setVisible(true);//通过id查找,也可以用setIcon()设置图标
// toolBar.getMenu().getItem(0).setVisible(true);//通过位置查找
}
}
/**
* 隐藏title图标
* @param itemId :图标对应的选项id
* */
protected void goneTitleRes(int... itemId){
if (titleBack != null)
titleBack.setVisibility(View.GONE);
for (int item:itemId){
//隐藏
toolBar.getMenu().findItem(item).setVisible(false);
}
}
/**
* title右侧文字
* @param str :文字内容
* */
protected void setTitleRightText(String str){
TextView textView = getView(R.id.title_rightTv);
textView.setVisibility(View.VISIBLE);
textView.setText(str);
textView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.title_back && is_title_back){
onBackPressed();
}
}
//toolbar菜单监听
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
}
3.Activity使用
public class MainActivity extends BaseActivity{
@Override
protected void setRootView() {
super.setRootView();
setContentView(R.layout.activity_main);
}
@Override
protected void initWidght() {
super.initWidght();
setTitleName(getResources().getString(R.string.chat));//title
// setTitleBack(false,R.mipmap.ic_search);//有图标,但不是返回
//setTitleBack(true,0);//返回
// setTitleRightText("保存");//右侧文字
showTitleRes(R.id.title_add,R.id.title.setting);//扩展menu(图标)
//goneTitleRes(R.id.title_add);隐藏图标,一般用不到
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.title_back){
workFragment.titleSearch();
}
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.title_add://添加
break;
case R.id.title_apps://应用break;
case R.id.title_setting://设置
break;
}
return super.onMenuItemClick(item);
}
}
Toolbar其他设置
1.去掉左边空白,在style文件里设置
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorAppTheme</item>
<item name="colorPrimaryDark">@color/colorAppTheme</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="toolbarStyle" tools:ignore="NewApi">@style/MyToolBar</item>
</style>
<style name="MyToolBar" parent="Widget.AppCompat.Toolbar">
<!--左边边距-->
<item name="contentInsetStart">0dp</item>
</style>