Android中LayoutInflater.setFactory的初步认识!

作者:燕歆波

导读:在创建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的,如果程序中有不能调用的方法,是会异常的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值