Android 自定义ToolBar详细使用

fuzhangandroid 2018-03-17

自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用

Android 自定义ToolBar详细使用Android 自定义ToolBar详细使用

Android 自定义ToolBar详细使用Android 自定义ToolBar详细使用

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>

相关推荐