InputLayout

2017-03-27  本文已影响0人  AnnaLeeYY

输入框布局

在涉及注册登录等逻辑,往往会有输入框布局,不同的项目往往UI样式区别非常大,例如如下几种

Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

总结起来就是, UI样式千变万化, 但是功能上,都是包含输入框 和 功能按钮, 一般输入框只有一个, 但是功能按不止有一个, 功能上只有,切换密码可见性、清空功能;

第一次思考

我本打算做 许多UI模板,然后用布局工厂去造出来不同的布局, 这样就能适用于实际开发场景,但是问题来了,每写一种Ui,都要在工厂里面配置一次,这样还是非常不好的。

第二次思考

我记得子View使用的属性,可以来于父控件的 LayoutParams 所以我们可以写一个自定义的相对布局、帧布局、线性布局去替换系统的,那么问题又来了, 相同的代码,我们需要写3次,所以我们需要引入一些设计模式;

先看用法

Paste_Image.png

InputRelativeLayout

public class InputRelativeLayout extends RelativeLayout {
    private InputLayoutHelper inputLayoutHelper;

    public InputRelativeLayout(Context context) {
        super(context);
        initView();
    }

    public InputRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private void initView() {
        setTag("ignore");
        inputLayoutHelper = new InputLayoutHelper();
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        inputLayoutHelper.onFinishInflate(this);
    }

    public static class LayoutParams extends RelativeLayout.LayoutParams implements IParamsProxy {
        private ParamsProxy paramsProxy;

        public LayoutParams(Context context, AttributeSet attrs) {
            super(context, attrs);
            paramsProxy = new ParamsProxy().obtainStyledAttributes(context, attrs);
        }

        @Override
        public IParams getInputParams() {
            return paramsProxy;
        }
    }

    @Override
    public RelativeLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new LayoutParams(getContext(), attrs);
    }

}

源码 InputLayout

上一篇下一篇

猜你喜欢

热点阅读