Android中自定义LayoutInflater.Factory实现全局替换系统控件(比如TextView,EditText等)

我已写了DEMO放到github , 地址:https://github.com/chenglin198751/InflaterFactoryDemo/tree/master

我们有时会遇到这么一个需求,就是要把全局的TextView 、 EditText 替换为自定义的TextView、EditText(比如自定义字体、或者自定义emoji表情时)。如果手动一个个去替换,那不累死了。那有没有一个方法可以全局替换呢?其实安卓系统已经给我们提供了这么一个方法,只需几行代码就能做到。

1、假设你已经写好了你的自定义TextView,名字叫CustomTextView 。那么首先我们要自定义一个LayoutInflater.Factory ,代码如下:

public class MyLayoutInflaterFactory implements LayoutInflater.Factory {
    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        if (name.equals("TextView")) {
            return new CustomTextView(context, attrs);
        }
        return null;
    }
}

2、再你的BaseActivity里面重写getSystemService(String name) 方法,代码如下:
public class BaseActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public Object getSystemService(String name) {
        if (name.equals(Context.LAYOUT_INFLATER_SERVICE)) {
            LayoutInflater inflater = (LayoutInflater) super.getSystemService(name);
            if (inflater.getFactory() == null) {
                inflater.setFactory(new MyLayoutInflaterFactory());
            }
            return inflater;
        }
        return super.getSystemService(name);
    }
}

3、有时开发者也会调用Application里面的getSystemService(String name)方法。那么为了保险起见,我们也把自己的Application里面的getSystemService(String name)方法重写了,代码跟上面一样,只不过是写在Application里面:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public Object getSystemService(String name) {
        if (name.equals(Context.LAYOUT_INFLATER_SERVICE)) {
            LayoutInflater inflater = (LayoutInflater) super.getSystemService(name);
            if (inflater.getFactory() == null) {
                inflater.setFactory(new MyLayoutInflaterFactory());
            }
            return inflater;
        }
        return super.getSystemService(name);
    }
}

OK ,完工,现在在你的业务层Activity里面去打印日志,看看是不是很惊喜:
        mTextView = (TextView) findViewById(R.id.text_view);

        if (mTextView instanceof CustomTextView) {
            Log.v("tag_2", "CustomTextView");
        }

如果你觉得帮到了你,请给作者打赏一口饭吃:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值