Toolbar的封装及使用

本文介绍如何在Android应用中封装Toolbar组件,以减少重复代码并提高开发效率。通过自定义ToolBarActivity和ToolbarHelper类,实现Toolbar的统一管理和个性化设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个app中如果多次的使用Toolbar,会写很多重复的代码,这也不符合我们的编程思想.所以要对Toolbar进行封装.

代码框架

程序效果(这里进行简单的设置)


布局文件
主窗体中没有进行编写
ToolbarActivity的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"
    tools:context="com.dubuwucool.toolbardemo.ToolBarActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_blue_dark">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                >
                <EditText
                    android:id="@+id/edt_text"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:background="@drawable/round"
                    android:gravity="center"
                    android:hint="输入商品、店铺、类型等"
                    android:textSize="25sp"
                    android:layout_toRightOf="@+id/imgShow"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"/>

                <ImageView
                    android:id="@+id/imgShow"
                    android:layout_width="40dp"
                    android:layout_height="30dp"
                    android:src="@drawable/serach"
                    android:layout_marginLeft="15dp"
                    android:layout_marginStart="15dp"
                    android:layout_centerVertical="true"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"/>
            </RelativeLayout>

            <ImageButton
                android:layout_width="160dp"
                android:layout_height="40dp"
                android:layout_weight="3"
                android:background="@drawable/sound"
                android:layout_gravity="center_vertical"/>
        </LinearLayout>

    </android.support.v7.widget.Toolbar>

</RelativeLayout>

round.xml代码

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#FFFFFF" />
    <corners android:bottomRightRadius="15dp"
             android:bottomLeftRadius="15dp" android:topLeftRadius="15dp"
             android:topRightRadius="15dp" />
</shape>

步骤(具体功能看解析)

1.要使用Toolbar就必须先隐藏ActionBar
①可以改变某个activity的主题
 
②也可以改变某个app的主题
选中该行进入style文件中进行修改

修改为这样即可


2.创建一个ToolbarActivity

ToolBarActivity是继承AppCompatActivity 并重写setContentView方法
public class ToolBarActivity extends AppCompatActivity {

    private ToolbarHelper mToolbarHelper;

    //自定义ToolBarActivity,哪个activityToolbar,就继承该类
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //   setContentView(R.layout.activity_tool_bar);
    }

    //把记住布局的方法进行重写
    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        super.setContentView(layoutResID);
        //创建ToolbarHelper对象传递参数 1.上下文 2.布局资源
        mToolbarHelper new ToolbarHelper(this, layoutResID);
        //获取封装好的Toolbar对象
        Toolbar toolBar = mToolbarHelper.getToolBar();
        //设置ToolbarHelper类中默认指定的根容器
        setContentView(mToolbarHelper.getContentView());
        //自定义一些Toolbar的个性化设置     切记:该方法一定要在setSupportActionBar()之前,否则主标题的设置会无效
        onCreateCustomToolbar(toolBar);
        //设置支持Toolbar
        setSupportActionBar(toolBar);
    }

    //自定义一些Toolbar的个性化设置,继承activity记得要对他进行覆写
    public void onCreateCustomToolbar(Toolbar toolBar) {

    }

    //当用户点击菜单栏中的某个选项时,会调用此方法,重写此方法每当点击坐上发图标时,关闭Activity
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

3.创建ToolbarHelper类
这个类的功能是:先创建一个 ViewGroup 来作为视图的父 View,把用户定义的 View,和 toolBar 依次 Add 到 ViewGroup 中;

public class ToolbarHelper {
    //声明一个上下文  当把xml布局资源转换为view的时候用到
    private Context context;
    //跟布局
    private FrameLayout contentView;
    //用户传入的xml布局资源对象
    private View userView;
    private LayoutInflater inflater;
    //toolbar的对象,通过getToolbar获取
    private Toolbar toolBar;

    /**
     * Toolbar帮助类的构造方法,方便用户自定义Toolbar,进行对象的初始化
     *
     * @param context  上下文
     @param layoutID 布局xml资源
     */
    public ToolbarHelper(Context context, int layoutID) {
        //传递的上下文
        this.context = context;
        //因为普通类,没有getLayoutInflater()方法可以调用,
        // 所以传递一个上下文,通过LayoutInflater.from静态方法得到LayoutInflater对象
        inflater = LayoutInflater.from(context);
        //初始化整个内容
        initContentView();
        //初始化用户自定义的布局
        initUserView(layoutID);         
        //初始化ToolBar控件
        initToolBar();
    }

    //初始化整个布局内容
    private void initContentView() {
        //创建一个布局,作为视图容器的父容器
        contentView new FrameLayout(context);
        //设置参数对象,定义父窗体的宽高
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //把参数对象传递给视图容器
        contentView.setLayoutParams(layoutParams);
    }

    private void initUserView(int layoutID) {
        //把用户传递过来的布局xml资源转换为一个view对象
        userView inflater.inflate(layoutID, null);
        //设置参数对象,定义父窗体的宽高
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //   //把参数对象传递给视图容器
        userView.setLayoutParams(layoutParams);
    }

    private void initToolBar() {
        //把一个装有Toolbar的布局资源转换为一个View对象
        View inflate = inflater.inflate(R.layout.activity_tool_barcontentView);
        //找到布局xml文件资源列队Toolbar,设置为全局变量
        toolBar = (Toolbar) inflate.findViewById(R.id.toolBar);
    }

    //返回Toolbar的对象,方便用户对Toolbar的自定义
    public Toolbar getToolBar() {
        return toolBar;
    }

    //获取默认的跟布局对象,FrameLayout
    public FrameLayout getContentView() {
        return contentView;
    }
}


4.最后就是主窗体的代码

//MainActivity就是使用我们的Toolbar封装
public class MainActivity extends ToolBarActivity {
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       

    }
    //自定义控件属性,ToolBar的设置都在这里写
    @Override
    public void onCreateCustomToolbar(Toolbar toolBar) {
        super.onCreateCustomToolbar(toolBar);
        //设置Toolbar的菜单按钮
        toolBar.showOverflowMenu();
    }

    //初始化菜单的按钮
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        return true;
    }
   
    //设置菜单按钮的点击事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值