您的位置:首页技术文章
文章详情页

Android 实现带头部文字输入框的自定义控件

【字号: 日期:2022-09-19 16:12:03浏览:2作者:猪猪
前言

在app的输入框中,需要应用到很多带有前缀说明的输入框,运用原有的输入框和文本控件,一个带头部的输入框就会增加三个控件在layout文件中。当布局文件输入框较少的情况下,这样对后期维护影响不大,但在多个带头部的输入框下,布局文件代码量会很大,影响阅读以及后期维护。而封装过后的控件,在使用中仅仅需要几行代码可实现几十行的效果。

简介 带头部文字的输入框 可在xml定义头部文字样式 可在xml定义输入框样式 可在xml定义提示文字样式 可在xml定义头部和输入框的间距和边距 效果图

Android 实现带头部文字输入框的自定义控件

使用方法

<com.momin.common.widget.EditInputView android:layout_width='match_parent' android:layout_height='50dp' app:inputMarginStart='10dp' app:headerText='姓名' app:hint='请输入联系人姓名' app:inputType='text' app:maxLength='30'/>源码在这

有帮助请点个赞

attrs.xml 属性文档

<!-- 公共属性 --><!-- 前置文字内容 --><attr name='headerText' format='string'/><!-- 前置文字大小 --><attr name='headerTextSize' format='dimension'/><!-- 前置文字大小 --><attr name='headerTextStyle'> <flag name='normal' value='0' /> <flag name='bold' value='1' /> <flag name='italic' value='2' /></attr><!-- 前置文字颜色 --><attr name='headerTextColor' format='reference|color'/><!-- 前置文字左边间距 --><attr name='headerPaddingStart' format='dimension'/><!-- 前置文字右边间距 --><attr name='headerPaddingEnd' format='dimension'/><!-- 前置文字顶部间距 --><attr name='headerPaddingTop' format='dimension'/><!-- 前置文字底部间距 --><attr name='headerPaddingBottom' format='dimension'/><!-- 公共属性 --><!-- 带前置文字的输入框 --><declare-styleable name='EditInputView'> <!-- 文字内容 --> <attr name='text' format='string'/> <!-- 文字大小 --> <attr name='textSize' format='dimension'/> <!-- 文字颜色 --> <attr name='textColor' format='reference|color'/> <!-- 最大输入字符数 --> <attr name='maxLength' format='integer'/> <!-- 输入限制 --> <attr name='android:enabled'/> <!-- 输入类型 --> <attr name='android:inputType'/> <!-- 输入开始边距 --> <attr name='inputMarginStart' format='dimension'/> <!-- 输入结束边距 --> <attr name='inputMarginEnd' format='dimension'/> <!-- 输入顶部边距 --> <attr name='inputMarginTop' format='dimension'/> <!-- 输入底部边距 --> <attr name='inputMarginBottom' format='dimension'/> <!-- 输入开始间距 --> <attr name='inputPaddingStart' format='dimension'/> <!-- 输入结束间距 --> <attr name='inputPaddingEnd' format='dimension'/> <!-- 输入顶部间距 --> <attr name='inputPaddingTop' format='dimension'/> <!-- 输入底部间距 --> <attr name='inputPaddingBottom' format='dimension'/> <!-- 输入底部间距 --> <attr name='android:gravity'/> <!-- 提示文字 --> <attr name='hint' format='string'/> <!-- 提示文字颜色 --> <attr name='hintColor' format='reference|color'/> <!-- 前置文字内容 --> <attr name='headerText'/> <!-- 前置文字大小 --> <attr name='headerTextSize'/> <!-- 前置文字大小 --> <attr name='headerTextStyle'/> <!-- 前置文字颜色 --> <attr name='headerTextColor'/> <!-- 前置文字左边间距 --> <attr name='headerPaddingStart'/> <!-- 前置文字右边间距 --> <attr name='headerPaddingEnd'/> <!-- 前置文字顶部间距 --> <attr name='headerPaddingTop'/> <!-- 前置文字底部间距 --> <attr name='headerPaddingBottom'/></declare-styleable>

common_edit_input_view.xml 布局文件

<?xml version='1.0' encoding='utf-8'?><RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent'> <!-- 头部文字 --> <TextViewandroid: android:layout_width='wrap_content'android:layout_height='match_parent'android:gravity='start|center_vertical'/> <!-- 输入框 --> <EditTextandroid: android:layout_toEndOf='@id/tv_edit_head'android:layout_width='match_parent'android:layout_height='match_parent'android:singleLine='true'android:background='@null'android:textColor='@color/c_2B303C'android:gravity='end|center_vertical'/></RelativeLayout>

EditInputView.java 控件类

package com.momin.common.widget;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Typeface;import android.text.InputFilter;import android.text.TextUtils;import android.util.AttributeSet;import android.view.Gravity;import android.view.LayoutInflater;import android.view.inputmethod.EditorInfo;import android.widget.EditText;import android.widget.RelativeLayout;import android.widget.TextView;import androidx.annotation.ColorRes;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.core.content.ContextCompat;import com.momin.common.R;/** * <p>Title: EditInputView</p> * <p>Description: 带头部输入框 </p> * <p>Copyright: </p> * <p>Company: </p> * * @author Momin * @version 1.0 * @date 2021/3/10 18:00 */public class EditInputView extends RelativeLayout { TextView tvHead; EditText etInput; public EditInputView(Context context) {super(context);init(context, null); } public EditInputView(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context, attrs); } /** * 初始化 * * @param context 上下文 * @param attrs 资源 */ private void init(Context context, AttributeSet attrs) {// 初始化对象initView(context);// 获取资源对象TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.EditInputView);// 初始化输入框initEdit(context, typedArray);// 初始化头部文字CharSequence headText = typedArray.getText(R.styleable.EditInputView_headerText);if (TextUtils.isEmpty(headText)) { // 头部为空时 tvHead.setVisibility(GONE);} else { // 头部不为空时 tvHead.setVisibility(VISIBLE); initHeaderText(context, typedArray, headText);}// 回收资源对象typedArray.recycle(); } /** * 初始化视图 * * @param context 上下文 */ private void initView(Context context) {LayoutInflater.from(context).inflate(R.layout.common_edit_input_view, this);tvHead = findViewById(R.id.tv_edit_head);etInput = findViewById(R.id.et_edit_input); } /** * 初始化输入框 * * @param context 上下文 * @param typedArray 资源对象 */ private void initEdit(Context context, TypedArray typedArray) {// 初始内容CharSequence editText = typedArray.getText(R.styleable.EditInputView_text);if (!TextUtils.isEmpty(editText)) { etInput.setText(editText);}// 字体大小setViewTextSize(etInput, R.styleable.EditInputView_textSize, typedArray);// 字体颜色setViewTextColor(context, etInput, R.styleable.EditInputView_textColor, typedArray);// 设置间距setEditPadding(typedArray);// 设置边距setEditMargin(typedArray);// 输入类型限制setLimitInputType(typedArray);// 输入长度限制setLimitInputLen(typedArray);// 输入限制:可输入性setInputBoolean(typedArray);// 输入字体排列位置setInputGravity(typedArray);initEditHint(context, typedArray); } /** * 设置字体大小 * * @param view 被设置对象 * @param attrId属性Id * @param typedArray 资源对象 */ private void setViewTextSize(TextView view, int attrId, TypedArray typedArray) {float size = typedArray.getDimension(attrId, 14 * view.getPaint().density);view.getPaint().setTextSize(size); } /** * 设置字体风格 * * @param view 被设置对象 * @param attrId属性Id * @param typedArray 资源对象 */ private void setViewTextStyle(TextView view, int attrId, TypedArray typedArray) {int style = typedArray.getInt(attrId, Typeface.NORMAL);view.setTypeface(Typeface.defaultFromStyle(style)); } /** * 设置字体颜色 * * @param context 上下文 * @param view 被设置对象 * @param attrId属性Id * @param typedArray 资源对象 */ private void setViewTextColor(Context context, TextView view, int attrId, TypedArray typedArray) {int color = typedArray.getColor(attrId,ContextCompat.getColor(context, R.color.c_2B303C));view.setTextColor(color); } /** * 设置输入框间距 * * @param typedArray 资源对象 */ private void setEditPadding(TypedArray typedArray) {// 开始间距int paddingStart = (int)typedArray.getDimension(R.styleable.EditInputView_inputPaddingStart, 0);// 结束间距int paddingEnd = (int)typedArray.getDimension(R.styleable.EditInputView_inputPaddingEnd, 0);// 顶部间距int paddingTop = (int)typedArray.getDimension(R.styleable.EditInputView_inputPaddingTop, 0);// 底部间距int paddingBottom = (int)typedArray.getDimension(R.styleable.EditInputView_inputPaddingBottom, 0);etInput.setPadding(paddingStart, paddingTop, paddingEnd, paddingBottom); } /** * 设置输入框边距 * * @param typedArray 资源对象 */ private void setEditMargin(TypedArray typedArray) {// 开始边距int marginStart = (int)typedArray.getDimension(R.styleable.EditInputView_inputMarginStart, 0);// 结束边距int marginEnd = (int)typedArray.getDimension(R.styleable.EditInputView_inputMarginEnd, 0);// 顶部边距int marginTop = (int)typedArray.getDimension(R.styleable.EditInputView_inputMarginTop, 0);// 底部边距int marginBottom = (int)typedArray.getDimension(R.styleable.EditInputView_inputMarginBottom, 0);LayoutParams layoutParams = (LayoutParams)etInput.getLayoutParams();layoutParams.setMargins(marginStart, marginTop, marginEnd, marginBottom);etInput.setLayoutParams(layoutParams); } /** * 设置输入类型限制 * * @param typedArray 资源对象 */ private void setLimitInputType(TypedArray typedArray) {etInput.setInputType(typedArray.getInt(R.styleable.EditInputView_android_inputType, EditorInfo.TYPE_NULL)); } /** * 设置输入长度限制 * * @param typedArray 资源对象 */ private void setLimitInputLen(TypedArray typedArray) {int len = typedArray.getInteger(R.styleable.EditInputView_maxLength, 0);if (len > 0) { setMaxLength(len);} } /** * 输入限制:可输入性 * * @param typedArray 资源对象 */ private void setInputBoolean(TypedArray typedArray) {etInput.setEnabled(typedArray.getBoolean(R.styleable.EditInputView_android_enabled, true)); } /** * 输入字体排列位置 * * @param typedArray 资源对象 */ private void setInputGravity(TypedArray typedArray) {etInput.setGravity(typedArray.getInt(R.styleable.EditInputView_android_gravity,Gravity.END|Gravity.CENTER_VERTICAL)); } /** * 初始化输入框提示文字 * * @param context 上上下文 * @param typedArray 资源对象 */ private void initEditHint(Context context, TypedArray typedArray) {CharSequence hintText = typedArray.getText(R.styleable.EditInputView_hint);if (!TextUtils.isEmpty(hintText)) { // 提示文字不为空 // 提示内容 etInput.setHint(hintText); // 提示文字颜色 int color = typedArray.getColor(R.styleable.EditInputView_hintColor, ContextCompat.getColor(context, R.color.c_D2D0DC)); etInput.setHintTextColor(color);} } /** * 初始化头部文字 * * @param context 上下文 * @param typedArray 资源对象 * @param text 头部文字 */ private void initHeaderText(Context context, TypedArray typedArray, CharSequence text) {// 头部字体风格setViewTextStyle(tvHead, R.styleable.EditInputView_headerTextStyle, typedArray);// 头部字体颜色setViewTextColor(context, tvHead, R.styleable.EditInputView_headerTextColor, typedArray);// 头部字体大小setViewTextSize(tvHead, R.styleable.EditInputView_headerTextSize, typedArray);// 头部开始间距int paddingStart = (int)typedArray.getDimension(R.styleable.EditInputView_headerPaddingStart, 0);// 头部结束间距int paddingEnd = (int)typedArray.getDimension(R.styleable.EditInputView_headerPaddingEnd, 0);// 头部顶部间距int paddingTop = (int)typedArray.getDimension(R.styleable.EditInputView_headerPaddingTop, 0);// 头部底部间距int paddingBottom = (int)typedArray.getDimension(R.styleable.EditInputView_headerPaddingBottom, 0);tvHead.setText(text);tvHead.setPadding(paddingStart, paddingTop, paddingEnd, paddingBottom); } /** * 设置头部内容 * * @param text 被设置内容 */ public void setHeadText(CharSequence text) {if (tvHead != null) { tvHead.setText(text);} } /** * 获取内容 * * @return 内容 */ public CharSequence getText() {if (etInput == null) { return null;} else { return etInput.getText();} } /** * 设置内容 * * @param text 被设置内容 */ public void setText(CharSequence text) {if (etInput != null) { etInput.setText(text);} } /** * 设置内容颜色 * * @param colorId 颜色资源Id */ public void setTextColor(@ColorRes int colorId) {if (etInput != null) { etInput.setTextColor(ContextCompat.getColor(getContext(), colorId));} } /** * 设置最大输入限制 * * @param len 限制值 */ public void setMaxLength(int len) {etInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(len)}); } public TextView getHeadTextView() {return tvHead; } public EditText getInputEditView() {return etInput; }}

以上就是Android 实现带头部文字输入框的自定义控件的详细内容,更多关于Android 文字输入框的自定义控件的资料请关注好吧啦网其它相关文章!

标签: Android
相关文章: