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