学习慕课网的一个教程,实现一个自定义TopBar:
- 一、attrs.xml
LinearLayout继承自ViewGroup,各个属性都来自于attrs.xml文件中定义的。
我们首先定义一个attrs.xml文件,配置我们的布局中需要定义的属性: - 二、定义自己的View: TopBar.java
- 定义需要的控件对象,两个button和一个textview
- 定义各个控件的属性值
- 在构造方法中,通过TypedArray获取在xml定义的属性:
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
ta中就包含了所有属性和值的映射,并从中获取属性的值。如图:
这样我们就取出了所有我们自定义的属性值,并将它们赋给相应的控件。
记得使用完TypedArray后,对他进行ta.recycle(),将其回收,避免浪费资源以及一些缓存错误。 - 之后实例化之前定义的button和textview,并将我们之前获取的属性值赋给它们,如图:
- 接下来将我们的控件放到ViewGroup里面
- 先为每个控件定义一个LayoutParams的变量,然后实例化这几个变量。
- 在实例化时,同时设置控件的layout_wight和layout_height属性,然后再设置居中等其他属性。
- 最后调用addView()方法,将我们的控件按照我们设置的params的模式添加到我们的viewgroup:
- 三.引用我们自定义的布局
- 在使用我们的布局时,一定要有完整的包名
- 为了能使用我们自己定义的属性,首先仿照系统的例子,要在开头添加一个name space(xmlns) :xmlns:myown=http://schemas.android.com/apk/res-auto
mywon是自己命名空间的名字,不能和系统的重复。 - 这样通过myown就可以引用我们在attrs.xml中定义的属性了:
- 四.为两个Button添加点击事件
- 在TopBar.java中直接添加button的点击事件:
- 为了能在不同的页面实现不同的点击事件,我们要实现动态的改变事件
这里用到了接口回调机制:
我们在设置点击事件时,是为setOnClickListener()提供了一个匿名内部类,匿名内部类中才是我们要实现的逻辑。
(1)我们定义一个接口: - (2)暴露一个方法给调用者,这个方法传入一个上面接口类型的参数,同时定义一个变量来映射传进来的接口:
- (3) 然后在我们的点击事件中,直接调用接口的两个方法:listener.leftClick();和listener,rightClick();
- (4) 在调用者调用时,通过暴露出来的这个setOnClickListener()方法,来实现其想要实现的点击逻辑。
- 五.此外,我们可以暴露其他方法,来实现某些功能
比如设置左边button是否显示: