一、Inflater与自定义控件
书接上回,我们现在来说一说Inflater。Inflater是将xml文件在Java文件中解析成视图的工具。它就相当于一个更大的findViewById,findVIewById是找xml文件中的控件,而Inflater则是找xml文件整个来做视图。
1.Inflater实例化的三种方式
工欲善其事必先利其器,无论我们使用什么工具,第一步都是将其实例化。
mLayoutInflater = getLayoutInflater();
mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
mLayoutInflater = LayoutInflater.from(MainActivity.this);
是不是看起来很眼熟?对,在上一次我们再说listview的时候。就曾经使用过第二个方式来读取视图。那么,还记得我们在实例化之后怎么使用他的么?是的,我们使用了一个视图类型view使用Inflater方法得到了它。
View view = inflater.inflate(R.layout.custom, null);
在这之后,我们就可以使用view的名称.findViewById来找到控件进行操作了。如:
EditText editText = (EditText)view.findViewById(R.id.content);
2.如何自己画一个控件
自定义控件的方式是继承已有的控件、布局或直接继承view。这里以继承View为例
1/创建新的控件class并继承你想要继承的
public class MyLearn extends View{
public MyLearn(Context context) {
super(context);
}
public MyLearn(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLearn(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
在继承后使用快捷键直接构成其构造器,然后在每个里面进行一次初始化。
当然,学过Java的小伙伴们都知道,使用this去调用其他的构造方法是一种重码率更低,更有效的方法。
public TestRedButton(Context context) {
this(context, null);}
public TestRedButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);}
public TestRedButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context,attrs, defStyleAttr);
init(context,attrs);
}
2/使用onDraw
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 做一个圆形的红色按钮