Android自定義帶刪除和錯(cuò)誤提示的EditText

這段時(shí)間在做新版的APP,在寫登錄頁面的時(shí)候,發(fā)現(xiàn)了AS直接創(chuàng)建的LoginActivity自帶的輸入框效果體驗(yàn)還不錯(cuò),在有輸入時(shí)把hint的內(nèi)容移到上方,無輸入時(shí)隱藏掉,輸入錯(cuò)誤的時(shí)候右邊提示錯(cuò)誤信息,遺憾的是沒有刪除按鈕,在實(shí)際開發(fā)當(dāng)中,產(chǎn)品還是喜歡放上刪除按鈕的。總得來說,還是達(dá)不到理想的效果吧。然后就試著自己動(dòng)手封裝了一個(gè)。感覺效果還可以吧。(沒有錄制動(dòng)態(tài)圖,將就著看看吧~)


image.png

主要特點(diǎn):

1.有輸入時(shí)hint的內(nèi)容在上方顯示,無輸入時(shí)與EditText一樣;
2.右側(cè)有刪除按鈕,可設(shè)置顯示/隱藏,默認(rèn)顯示;
3.出錯(cuò)是可以再java代碼中控制顯示右側(cè)提示,當(dāng)控件再次獲取焦點(diǎn)重新輸入時(shí),錯(cuò)誤提示隱藏。
4.重寫了setOnFocusChangeListener方法,可以監(jiān)聽時(shí)候獲取光標(biāo);
5.添加addTextChangedListener方法,可以監(jiān)聽輸入內(nèi)容;
6.具有原生EditText的大部分功能,同時(shí)也提供了getInput方法,返回 EditText,可以進(jìn)行更多的原生EditText的設(shè)置。

java代碼

package com.ms.text.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.sunwoda.cloudplatform.R;

/**
 * ┏┓   ┏┓
 * ┏┛┻━━━┛┻┓
 * ┃       ┃
 * ┃   ━   ┃
 * ┃ ┳┛ ┗┳ ┃
 * ┃       ┃
 * ┃   ┻   ┃
 * ┃       ┃
 * ┗━┓   ┏━┛
 * ┃   ┃   神獸保佑
 * ┃   ┃   代碼無BUG!
 * ┃   ┗━━━┓
 * ┃       ┣┓
 * ┃       ┏┛
 * ┗┓┓┏━┳┓┏┛
 * ┃┫┫ ┃┫┫
 * ┗┻┛ ┗┻┛
 */

/**
 * @author ms
 * on 2019/4/29
 * Description:
 */
public class MsTextInputLayout extends RelativeLayout implements OnClickListener, TextWatcher, View.OnFocusChangeListener {
    private static final String TAG = "MsTextInputLayout";
    private static final int HINT_ID = 11111;
    private static final int EDIT_ID = 22222;
    private static final int DELETE_ID = 33333;
    private static final int ERROR_ID = 4444;
    /**
     * 提示內(nèi)容
     */
    private String inputHint;
    /**
     * 提示字體顏色
     */
    private int hintColor;
    /**
     * 提示字體大小
     */
    private float hintSize = 14;
    /**
     * 左邊圖標(biāo)
     */
    private int drawable;
    /**
     * 圖標(biāo)padding
     */
    private int drawablePadding = 5;
    /**
     * 輸入內(nèi)容
     */
    private String inputContent;
    /**
     * 輸入框Height
     */
    private int inputHeight = 5;
    /**
     * 輸入框padding
     */
    private int inputPadding = 5;
    /**
     * 輸入框paddingTop
     */
    private int inputPaddingTop = 5;
    /**
     * 輸入框paddingBottom
     */
    private int inputPaddingBottom = 5;
    /**
     * 輸入框paddingLeft
     */
    private int inputPaddingLeft = 5;
    /**
     * 輸入框paddingRight
     */
    private int inputPaddingRight = 5;
    /**
     * 輸入框背景
     */
    private Drawable inputBackground;
    /**
     * 輸入字體大小
     */
    private float inputSize = 16;
    /**
     * 輸入字體顏色
     */
    private int inputColor;
    /**
     * 是否顯示刪除按鈕
     */
    private int delBtnVisibility;
    /**
     * 重新獲取焦點(diǎn)時(shí),清除已輸入內(nèi)容
     */
    private boolean clearContentsFocus;
    /**
     * 錯(cuò)誤內(nèi)容
     */
    private String error;
    /**
     * 輸入類型
     */
    private int inputType;
    /**
     * 當(dāng)前對(duì)象
     */
    private Context mContext;
    /**
     * 提示text
     */
    private TextView hintView;
    /**
     * 錯(cuò)誤text
     */
    private TextView errorView;
    /**
     * 輸入框
     */
    private EditText editText;

    /**
     * 刪除按鈕
     */
    private DeleteButton delBtn;

    private TextWatcher textWatcher;
    private OnFocusChangeListener focusChangeListener;

    public MsTextInputLayout(Context context) {
        super(context);
        this.mContext = context;
        initView();
    }

    public MsTextInputLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MsTextInputLayout);

        inputHeight = typedArray.getLayoutDimension(R.styleable.MsTextInputLayout_inputHeight, LayoutParams.WRAP_CONTENT);

        inputHint = typedArray.getString(R.styleable.MsTextInputLayout_inputHint) == null ? "請(qǐng)輸入內(nèi)容" : typedArray.getString(R.styleable.MsTextInputLayout_inputHint);
        hintColor = typedArray.getColor(R.styleable.MsTextInputLayout_hintColor, Color.RED);
        hintSize = px2sp(typedArray.getDimension(R.styleable.MsTextInputLayout_hintSize, sp2px(hintSize)));
        drawable = typedArray.getResourceId(R.styleable.MsTextInputLayout_drawable, -1);
        drawablePadding = typedArray.getDimensionPixelOffset(R.styleable.MsTextInputLayout_drawablePadding, -1);
        inputContent = typedArray.getString(R.styleable.MsTextInputLayout_inputContent);

        inputPadding = typedArray.getDimensionPixelOffset(R.styleable.MsTextInputLayout_inputPadding, -1);
        inputPaddingTop = typedArray.getDimensionPixelOffset(R.styleable.MsTextInputLayout_inputPaddingTop, -1);
        inputPaddingRight = typedArray.getDimensionPixelOffset(R.styleable.MsTextInputLayout_inputPaddingRight, -1);
        inputPaddingBottom = typedArray.getDimensionPixelOffset(R.styleable.MsTextInputLayout_inputPaddingBottom, -1);
        inputPaddingLeft = typedArray.getDimensionPixelOffset(R.styleable.MsTextInputLayout_inputPaddingLeft, -1);

        inputBackground = typedArray.getDrawable(R.styleable.MsTextInputLayout_inputBackground);
        inputSize = px2sp(typedArray.getDimension(R.styleable.MsTextInputLayout_inputSize, sp2px(inputSize)));
        inputColor = typedArray.getColor(R.styleable.MsTextInputLayout_inputColor, Color.BLACK);
        delBtnVisibility = typedArray.getInt(R.styleable.MsTextInputLayout_delBtnVisibility, 1);
        clearContentsFocus = typedArray.getBoolean(R.styleable.MsTextInputLayout_clearContentsFocus, true);
        inputType = typedArray.getInt(R.styleable.MsTextInputLayout_android_inputType, InputType.TYPE_CLASS_TEXT);

        typedArray.recycle();
        initView();
    }


    private void initView() {

        hintView = new TextView(mContext);
        hintView.setId(HINT_ID);
        errorView = new TextView(mContext);
        errorView.setId(ERROR_ID);
        editText = new EditText(mContext);
        editText.setId(EDIT_ID);
        delBtn = new DeleteButton(mContext);
        delBtn.setId(DELETE_ID);
        delBtn.setOnClickListener(this);

        RelativeLayout.LayoutParams hintViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        hintView.setText(inputHint);
        addView(hintView, hintViewParams);


        RelativeLayout.LayoutParams editTextParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, inputHeight);
        editTextParams.addRule(RelativeLayout.BELOW, hintView.getId());
        addView(editText, editTextParams);

        RelativeLayout.LayoutParams delBtnParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        delBtnParams.addRule(RelativeLayout.ALIGN_BOTTOM, editText.getId());
        delBtnParams.addRule(RelativeLayout.ALIGN_RIGHT, editText.getId());
        delBtnParams.addRule(RelativeLayout.ALIGN_TOP, editText.getId());
        delBtnParams.rightMargin = 10;
        delBtnParams.leftMargin = 30;
        delBtnParams.bottomMargin = 10;
        delBtn.setPadding(20);
        addView(delBtn, delBtnParams);

        RelativeLayout.LayoutParams errorViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        errorViewParams.addRule(RelativeLayout.ALIGN_TOP, editText.getId());
        errorViewParams.addRule(RelativeLayout.ALIGN_BOTTOM, editText.getId());
        errorViewParams.addRule(RelativeLayout.LEFT_OF, delBtn.getId());
        errorView.setText("錯(cuò)誤的輸入");
        errorView.setTextColor(Color.RED);
        errorView.setGravity(Gravity.CENTER_VERTICAL);
        addView(errorView, errorViewParams);
        initConfig();
    }

    /**
     * 初始化配置
     */
    void initConfig() {
        errorView.setVisibility(GONE);
        hintView.setVisibility(GONE);

        hintView.setTextColor(hintColor);
        hintView.setTextSize(hintSize);
        hintView.setText(inputHint);
        hintView.setPadding(10, 0, 0, 0);

        if (drawable != -1) {

            Drawable drawable = ContextCompat.getDrawable(mContext, this.drawable);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
            editText.setCompoundDrawables(drawable, null, null, null);
            editText.setCompoundDrawablePadding(drawablePadding);
        }

        if (inputPadding == -1) {
            editText.setPadding(inputPaddingLeft > editText.getPaddingLeft() ? inputPaddingLeft : editText.getPaddingLeft(), inputPaddingTop > editText.getPaddingTop() ? inputPaddingTop : editText.getPaddingTop(), inputPaddingRight > editText.getPaddingRight() ? inputPaddingRight : editText.getPaddingRight(), inputPaddingBottom > editText.getPaddingBottom() ? inputPaddingBottom : editText.getPaddingBottom());
        } else {
            editText.setPadding(inputPadding > editText.getPaddingLeft() ? inputPadding : editText.getPaddingLeft(), inputPadding > editText.getPaddingTop() ? inputPadding : editText.getPaddingTop(), inputPadding > editText.getPaddingRight() ? inputPadding : editText.getPaddingRight(), inputPadding > editText.getPaddingBottom() ? inputPadding : editText.getPaddingBottom());

        }
        editText.setInputType(inputType);
        editText.setTextColor(inputColor);
        editText.setTextSize(inputSize);
        editText.setHint(inputHint);
        editText.setMaxLines(1);
        editText.setSingleLine(true);

        editText.addTextChangedListener(this);
        if (inputBackground != null) {
            editText.setBackground(inputBackground);
        }
        editText.setOnFocusChangeListener(this);

        delBtn.setVisibility(delBtnVisibility);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //強(qiáng)制高度為WRAP_CONTENT,不然有輸入的時(shí)候會(huì)出現(xiàn)顯示不全的bug
        getLayoutParams().height = LayoutParams.WRAP_CONTENT;
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }


    /**
     * 輸入監(jiān)聽
     *
     * @param textWatcher
     */
    public void addTextChangedListener(TextWatcher textWatcher) {
        this.textWatcher = textWatcher;
    }

    /**
     * 設(shè)置輸入框提示
     *
     * @param inputHint
     */
    public void setInputHint(String inputHint) {
        this.inputHint = inputHint;
        hintView.setText(inputHint);
        editText.setHint(inputHint);
    }

    /**
     * 設(shè)置有輸入時(shí),輸入框上方提示文字顏色
     *
     * @param hintColor
     */
    public void setHintColor(int hintColor) {
        this.hintColor = hintColor;
        hintView.setTextColor(hintColor);
    }

    /**
     * 設(shè)置有輸入時(shí),輸入框上方提示文字大小 單位:sp
     *
     * @param hintSize
     */
    public void setHintSize(float hintSize) {
        this.hintSize = hintSize;
        hintView.setTextSize(hintSize);

    }

    /**
     * 輸入框輸入類型
     * @param type
     */
    public void setInputType(int type){
        editText.setInputType(type);
    }

    /**
     * 設(shè)置輸入框左邊圖標(biāo)
     *
     * @param id
     */
    public void setDrawable(int id) {
        this.drawable = id;
        Drawable drawable = ContextCompat.getDrawable(mContext, this.drawable);
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
        editText.setCompoundDrawables(drawable, null, null, null);
    }

    /**
     * 設(shè)置輸入框左邊圖標(biāo) Padding
     *
     * @param drawablePadding
     */
    public void setDrawablePadding(int drawablePadding) {
        this.drawablePadding = drawablePadding;
        editText.setCompoundDrawablePadding(drawablePadding);
    }

    /**
     * 設(shè)置輸入框內(nèi)容
     *
     * @param inputContent
     */
    public void setInputContent(String inputContent) {
        this.inputContent = inputContent;
        editText.setText(inputContent);
    }

    /**
     * 獲取輸入框內(nèi)容
     *
     * @return 輸入框內(nèi)容
     */
    public String getInputContent() {
        return editText.getText().toString().trim();
    }

    /**
     * 設(shè)置輸入框高度
     *
     * @param inputHeight
     */
    public void setInputHeight(int inputHeight) {
        this.inputHeight = inputHeight;
    }

    /**
     * 設(shè)置輸入框padding
     *
     * @param inputPadding
     */
    public void setInputPadding(int inputPadding) {
        this.inputPadding = inputPadding;
    }

    /**
     * 設(shè)置輸入框 inputPaddingTop
     *
     * @param inputPaddingTop
     */
    public void setInputPaddingTop(int inputPaddingTop) {
        this.inputPaddingTop = inputPaddingTop;
    }

    /**
     * 設(shè)置輸入框 inputPaddingBottom
     *
     * @param inputPaddingBottom
     */
    public void setInputPaddingBottom(int inputPaddingBottom) {
        this.inputPaddingBottom = inputPaddingBottom;
    }

    /**
     * 設(shè)置輸入框 inputPaddingLeft
     *
     * @param inputPaddingLeft
     */
    public void setInputPaddingLeft(int inputPaddingLeft) {
        this.inputPaddingLeft = inputPaddingLeft;
    }

    /**
     * 設(shè)置輸入框 inputPaddingRight
     *
     * @param inputPaddingRight
     */
    public void setInputPaddingRight(int inputPaddingRight) {
        this.inputPaddingRight = inputPaddingRight;
    }

    /**
     * 設(shè)置輸入框背景
     *
     * @param drawable
     */
    public void setInputBackground(Drawable drawable) {
        this.inputBackground = drawable;
        editText.setBackground(inputBackground);
    }

    /**
     * 設(shè)置輸入框背景
     *
     * @param resId
     */
    public void setInputBackgroundResource(int resId) {
        editText.setBackgroundResource(resId);
    }

    /**
     * 設(shè)置輸入框背景
     *
     * @param color
     */
    public void setInputBackgroundColor(int color) {
        editText.setBackgroundColor(color);
    }

    /**
     * 設(shè)置輸入框字體大小
     *
     * @param inputSize
     */
    public void setInputSize(float inputSize) {
        this.inputSize = inputSize;
        editText.setTextSize(inputSize);
    }

    /**
     * 設(shè)置輸入框字體顏色
     *
     * @param inputColor
     */
    public void setInputColor(int inputColor) {
        this.inputColor = inputColor;
        editText.setTextColor(inputColor);
    }

    /**
     * 設(shè)置刪除按鈕顯示隱藏 默認(rèn)顯示
     *
     * @param delBtnVisibility
     */
    public void setDelBtnVisibility(int delBtnVisibility) {
        this.delBtnVisibility = delBtnVisibility;
        delBtn.setVisibility(delBtnVisibility);
    }

    /**
     * 設(shè)置輸入錯(cuò)誤時(shí),再次獲取光標(biāo)是否清除內(nèi)容
     *
     * @param clearContentsFocus
     */
    public void setClearContentsFocus(boolean clearContentsFocus) {
        this.clearContentsFocus = clearContentsFocus;
    }

    /**
     * 設(shè)置輸入有誤信息
     *
     * @param err
     */
    public void setError(String err) {
        if (err.length() <= 0) {
            return;
        }
        if (errorView.getVisibility() == GONE) {
            errorView.setVisibility(VISIBLE);
        }
        errorView.setText(err);
    }

    /**
     * 設(shè)置錯(cuò)誤提示顯示/隱藏
     *
     * @param visibility
     */
    public void setErrorVisibility(int visibility) {
        errorView.setVisibility(visibility);
    }

    /**
     * 獲取輸入框,進(jìn)行更多的原生editText的設(shè)置
     * @return
     */
    public EditText getInput(){
        return editText;
    }

    @Override
    public void setOnFocusChangeListener(OnFocusChangeListener listener) {
        this.focusChangeListener = listener;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case DELETE_ID:
                editText.setText("");
                break;

            default:

                break;
        }
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (textWatcher != null) {
            textWatcher.beforeTextChanged(charSequence, i, i1, i2);
        }
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (textWatcher != null) {
            textWatcher.onTextChanged(charSequence, i, i1, i2);
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (textWatcher != null) {
            textWatcher.afterTextChanged(editable);
        }
        if (editable.length() > 0) {
            hintView.setVisibility(VISIBLE);
            if (errorView.getVisibility() == VISIBLE) {
                errorView.setVisibility(GONE);
            }
        } else {
            hintView.setVisibility(GONE);
        }
    }

    @Override
    public void onFocusChange(View view, boolean b) {
        if (focusChangeListener != null) {
            focusChangeListener.onFocusChange(view, b);
        }
        if (b) {
            //獲得焦點(diǎn)
            if (clearContentsFocus && errorView.getVisibility() == VISIBLE) {
                editText.setText("");
            } else {
                editText.setSelection(editText.getText().length());
            }
        } else {
            //失去焦點(diǎn)

        }
    }


    /**
     * 刪除按鈕
     */
    class DeleteButton extends View {
        int padding = 10;

        public DeleteButton(Context context) {
            super(context);

        }

        @Override
        public void setPadding(int left, int top, int right, int bottom) {
            super.setPadding(left, top, right, bottom);
        }

        public void setPadding(int padding) {
            this.padding = padding;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            int diam = getWidth() > getHeight() ? getHeight() : getWidth();
            int width = getWidth();
            int height = getHeight();
            int centreX = width / 2;
            int centreY = height / 2;
            int radius = diam / 2;
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.parseColor("#D1D6D9"));
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius - padding, paint);
            Paint paint1 = new Paint();
            paint1.setAntiAlias(true);
            paint1.setColor(Color.WHITE);
            paint1.setStrokeWidth(12);
            canvas.drawLine((float) (centreX - Math.sqrt(2) / 2 * radius + (radius + padding) / 3), (float) (centreY - Math.sqrt(2) / 2 * radius + (radius + padding) / 3), (float) (centreX + Math.sqrt(2) / 2 * radius - (radius + padding) / 3), (float) (centreY + Math.sqrt(2) / 2 * radius - (radius + padding) / 3), paint1);
            canvas.drawLine((float) (centreX - Math.sqrt(2) / 2 * radius + (radius + padding) / 3), (float) (centreY + Math.sqrt(2) / 2 * radius - (radius + padding) / 3), (float) (centreX + Math.sqrt(2) / 2 * radius - (radius + padding) / 3), (float) (centreY - Math.sqrt(2) / 2 * radius + (radius + padding) / 3), paint1);
        }


        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            // get calculate mode of width and height
            int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
            int modeHeight = MeasureSpec.getMode(heightMeasureSpec);

            // get recommend width and height
            int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
            int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);

            // this view used in scrollView or listview or recyclerView
            if (modeWidth == MeasureSpec.UNSPECIFIED) {
                int wrap_width = 100 + getPaddingLeft() + getPaddingRight();
                sizeWidth = wrap_width;
                modeWidth = MeasureSpec.EXACTLY;
            }
            // this view used in scrollView or listview or recyclerView
            if (modeHeight == MeasureSpec.UNSPECIFIED) {
                int wrap_height = 100 + getPaddingTop() + getPaddingBottom();
                sizeHeight = wrap_height;
                modeHeight = MeasureSpec.EXACTLY;
            }
            // wrap_content
            if (modeWidth == MeasureSpec.AT_MOST) {
                int wrap_width = 100 + getPaddingLeft() + getPaddingRight();
                sizeWidth = Math.min(wrap_width, sizeWidth);
                modeWidth = MeasureSpec.EXACTLY;
            }
            // wrap_content
            if (modeHeight == MeasureSpec.AT_MOST) {
                int wrap_height = 100 + getPaddingTop() + getPaddingBottom();
                sizeHeight = Math.min(wrap_height, sizeHeight);
                modeHeight = MeasureSpec.EXACTLY;
            }

            widthMeasureSpec = MeasureSpec.makeMeasureSpec(sizeWidth, modeWidth);
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(sizeHeight, modeHeight);

            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        }
    }


    /**
     * sp轉(zhuǎn)px
     *
     * @param spVal
     * @return
     */
    public int sp2px(float spVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
                spVal, mContext.getResources().getDisplayMetrics());
    }

    /**
     * px轉(zhuǎn)sp
     *
     * @param pxVal
     * @return
     */
    public float px2sp(float pxVal) {
        return (pxVal / mContext.getResources().getDisplayMetrics().scaledDensity);
    }
}

attrs代碼

如果想在xml文件中使用editText原生的屬性,可以自行添加,像<attr name="android:inputType"/>一樣,在java代碼中調(diào)用editText相應(yīng)的方法設(shè)置即可。


    <declare-styleable name="MsTextInputLayout">
        <attr name="hintColor" format="color"/>
        <attr name="hintSize" format="dimension"/>
        <attr name="drawable" format="reference"/>
        <attr name="drawablePadding" format="dimension"/>
        <attr name="inputHint" format="string"/>
        <attr name="inputPaddingTop" format="dimension"/>
        <attr name="inputPaddingBottom" format="dimension"/>
        <attr name="inputPaddingLeft" format="dimension"/>
        <attr name="inputPaddingRight" format="dimension"/>
        <attr name="inputContent" format="string"/>
        <attr name="inputPadding" format="dimension"/>
        <attr name="inputBackground" format="reference|color|dimension"/>
        <attr name="inputSize" format="dimension"/>
        <attr name="inputColor" format="color"/>
        <attr name="inputHeight" format="dimension"/>
        <attr name="android:inputType"/>
        <attr name="delBtnVisibility" >
            <enum name="visible" value="1"/>
            <enum name="gone" value="8"/>
        </attr>
        <attr name="clearContentsFocus" format="boolean"/>

    </declare-styleable>

layout代碼

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".LoginActivity">

    <ScrollView
        android:id="@+id/login_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/email_login_form"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <com.ms.text.view.MsTextInputLayout
                android:id="@+id/input_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:hintColor="@color/colorAccent"
                app:drawable="@mipmap/ic_launcher"
                app:inputBackground="#009eda"
                app:inputColor="@color/colorInput"
                android:inputType="number"
                app:inputHeight="48dp"
                app:inputHint="請(qǐng)輸入手機(jī)號(hào)"/>

            <com.ms.text.view.MsTextInputLayout
                android:id="@+id/input_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                app:hintColor="@color/colorAccent"
                app:inputColor="@color/colorInput"
                app:inputHeight="48dp"
                app:inputHint="請(qǐng)輸入密碼"
                app:inputPaddingLeft="10dp"
                app:delBtnVisibility="gone"
                app:inputPaddingRight="10dp" />

            <Button
                android:id="@+id/button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:text="確定" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容