作者:燕歆波
导读:在创建Activity的时候,默认情况下,创建的页面是继承AppCompatActivity的,也可以手动改成Activity,那么继承这两者的控件有什么不同吗?
发现
创建一个页面先后继承AppCompatActivity和Activity,然后打印出控件的类名称!分别看看打印的log:
Log.i("yxs", textView.getClass().getSimpleName() + "控件");
分别是:
1、AppCompatTextView控件
2、TextView控件
发现继承不同的基类,控件的也不相同了,在布局里面命名写的是TextView,怎么变成了AppCompatTextView呢?页面中什么都没做啊?
原因
经过朋友的指点,在AppCompatViewInflater这个类中找到了相关操作:
具体的流程我大致看了一遍,但是也不是很清楚,就不在这里说了,需要说的是LayoutInflater.setFactory这个东西,系统在加载布局的时候,其实也是通过inflate加载布局的方法来实现的,就是在这个时候,TextView被变成了AppCompatTextView,知道了这个,完全可以在加载View的时候进行拦截,这个操作必须在创建view之前:
在onCreate之前,判断加载的控件是不是button,如果是Button,就改变它的字体样式、颜色、大小,如果不是Button,则按照原始的样式来。
这样,在加载view的时候,就已经将它的样式改变了,当然,当判断到这个控件是Button的时候,完全可以返回一个TextView,这样,在打印控件的类名称时候,就不在是Button了,而是TextView;但是如果是Button转成ImageView的话,就要注意了,ImageView是直接继承View的,而Button是继承TextView的,如果程序中有不能调用的方法,是会异常的。