(1)在Android 入门刚入门的时候,学习原生的控件,到后来,原生控件不满足开发的需求的,就自定义控件,但是自定义的控件需要写上全路径,不然就会报错,正所谓知其然知其所以然,后来就翻看了布局填充器(LayoutInflater)的源码,具体的实现类是PhotoLayoutInflater。
部分代码
View createViewFromTag(View parent,String name ,AttributeSet attrs){
·····
if(view==null){
if(-1 == name.indexOf('.')){
view =onCreateView(parent,name,attrs);//系统自带
}else{
view=createView(name,null,attrs);
}
}
}
也就是说ceatViewFromTag里面会去判断 name 是否含有‘’.”,如果有,则认为是自定义view,否则就是系统自带,也就是最后走下面这个方法。
@override
protected View onCreateView(String name,AttributeSet attrs) throws ClassNoFoundException{
private static final String[] sClassPrefixList={"android.widget.","android.webkit."}
for(String prefix:sClassPrefixList){
View view =createView(name,prefix,attrs);
}
}
否则就走
public final View createView(String name, String prefix, AttributeSet attrs){
if (constructor == null) {
// Class not found in the cache, see if it's real, and try to add it
//如果prefix不为空就构造view路径并加载
clazz = mContext.getClassLoader().loadClass(
prefix != null ? (prefix + name) : name).asSubclass(View.class);}
而TextView .Button等都在
android.widget.这个包下
所以,就知道为啥原生控件不用写全路径,而自定义View就要了。
end