輸入框布局
在涉及注冊登錄等邏輯休涤,往往會有輸入框布局咏连,不同的項目往往UI樣式區(qū)別非常大敏弃,例如如下幾種
總結(jié)起來就是卦羡, UI樣式千變?nèi)f化, 但是功能上麦到,都是包含輸入框 和 功能按鈕绿饵, 一般輸入框只有一個, 但是功能按不止有一個瓶颠, 功能上只有拟赊,切換密碼可見性、清空功能粹淋;
第一次思考
我本打算做 許多UI模板吸祟,然后用布局工廠去造出來不同的布局, 這樣就能適用于實際開發(fā)場景桃移,但是問題來了屋匕,每寫一種Ui,都要在工廠里面配置一次谴轮,這樣還是非常不好的炒瘟。
第二次思考
我記得子View使用的屬性吹埠,可以來于父控件的 LayoutParams 所以我們可以寫一個自定義的相對布局第步、幀布局、線性布局去替換系統(tǒng)的缘琅,那么問題又來了粘都, 相同的代碼,我們需要寫3次刷袍,所以我們需要引入一些設(shè)計模式翩隧;
先看用法
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