安卓自定义VIEWAndroid自定义控件Android技术知识

自定义View--登录界面输入框

2017-11-13  本文已影响58人  请叫我张懂

效果展示

预览界面.png 效果显示

从图中可以看出这次自定义View的效果。具体功能如下:

开始自定义

一、 第一步先新建一个类名为EditTextPlus(可自己命名)继承FrameLayout的文件,因为我们要实现在布局文件中能是用自己的属性,所以我们还要在values目录下新建attrs.xml文件(用于添加自定义的属性)

第1步.png

二、在 attrs.xml 文件中添加如下属性(其中除了字体的基本属性之外,还包括了输入框的输入类型,键盘的类型等)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="EditTextPlus">
        <attr name="head_title_text" format="string" />
        <attr name="head_titile_text_size" format="dimension" />
        <attr name="head_title_text_color" format="color" />
        <attr name="edit_hint_text" format="string" />
        <attr name="edit_text_size" format="dimension" />
        <attr name="edit_text_color" format="color" />
        <attr name="edit_input_type" format="enum">
            <enum name="Text" value="0" />
            <enum name="Phone" value="1" />
            <enum name="Password" value="2" />
            <enum name="Number" value="3" />
        </attr>
            <!-- 键盘类型 -->
        <attr name="edit_editor_option" format="enum">
            <enum name="IME_ACTION_NONE" value="0" />
            <enum name="IME_ACTION_DONE" value="1" />
            <enum name="IME_ACTION_GO" value="2" />
            <enum name="IME_ACTION_NEXT" value="3" />
            <enum name="IME_ACTION_PREVIOUS" value="4" />
            <enum name="IME_ACTION_SEARCH" value="5" />
            <enum name="IME_ACTION_SEND" value="6" />
            <enum name="IME_ACTION_UNSPECIFIED" value="7" />
        </attr>
    </declare-styleable>
</resources>

那么添加了这些属性之后要如何使用呢?如下图所示:

使用自定义属性.png

其中最重要的是要使用下面那句话,才能使用自定义的属性。(xmlns:app中的app命名可以任意)

         xmlns:app="http://schemas.android.com/apk/res-auto"

三、在布局文件中已经使用了自定义的属性,那么我们现在要做的就是如何解析相关属性。所以我们回到EditTextPlus类中。

声明的成员变量.png

上图为类中声明的成员变量。

具体解析自定义属性的代码如下:

private void initAttr(AttributeSet attrs) {
    Drawable background = getBackground();
    //当没有设置background时使用默认的background
    if (null == background) {
        setBackgroundResource(R.drawable.drawable_default_edittext_plus);
    }
    TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.EditTextPlus);
    //
    mEditTextSize = typedArray.getDimension(R.styleable.EditTextPlus_edit_text_size, sp2px(mEditTextSize));
    mEditHintText = typedArray.getString(R.styleable.EditTextPlus_edit_hint_text);
    if (TextUtils.isEmpty(mEditHintText)) {
        mEditHintText = "";
    }
    mEditTextColor = typedArray.getColor(R.styleable.EditTextPlus_edit_text_color,
            ContextCompat.getColor(mContext, R.color.EditTextPlusDefaultTextColor));
    mInputType = typedArray.getInt(R.styleable.EditTextPlus_edit_input_type, mInputType);
    mEditorOption = typedArray.getInt(R.styleable.EditTextPlus_edit_editor_option, mEditorOption);
    //
    mHeadTextSize = typedArray.getDimension(R.styleable.EditTextPlus_head_titile_text_size, sp2px(mHeadTextSize));
    mHeadText = typedArray.getString(R.styleable.EditTextPlus_head_title_text);
    if (TextUtils.isEmpty(mHeadText)) {
        mHeadText = "未设置";
    }
    mHeadTextColor = typedArray.getColor(R.styleable.EditTextPlus_head_title_text_color, mEditTextColor);
    //
    typedArray.recycle();
}

获取属性方法的调用顺序如下

构造方法以及initAttr 和 initView方法.png

四、既然设置自定义属性的值,并且属性都设置到相应的位置。最后一个问题,就是如何将自定义View中的事件传输出去,如:删除按钮的点击事件。

public interface OnDeleteListener {
    void onDelete();
}
声明接口的成员变量.png 自定义接口的使用.png

GitHub地址: EditextDemo

上一篇 下一篇

猜你喜欢

热点阅读