自定义EditText(输入框字数限制并显示还能输入多少字)
下方代码是自定义EditText主要内容
public class CustomEditTextView extends LinearLayout {
private int edittextMaxNumber;
private EditText mEditText;
private View mLines;
private TextView mTextView;
private Context context;
private OnNumberWordsCallBack mOnNumberWordsCallBack;//回调
public OnNumberWordsCallBack getmOnNumberWordsCallBack() {
return mOnNumberWordsCallBack;
}
public void setmOnNumberWordsCallBack(OnNumberWordsCallBack mOnNumberWordsCallBack) {
this.mOnNumberWordsCallBack = mOnNumberWordsCallBack;
}
public CustomEditTextView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
setOrientation(LinearLayout.VERTICAL);
intEditText(context);
intLines(context);
intTextView(context);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CustomEditTextView);
if (attributes != null) {
//处理edittext
edittextMaxNumber = attributes.getInt(R.styleable.CustomEditTextView_edittext_max_number, 200);
mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(edittextMaxNumber)});
String hintText = attributes.getString(R.styleable.CustomEditTextView_edittext_hint_text);
if (!TextUtils.isEmpty(hintText)) {
mEditText.setHint(hintText);
}
//获取标题显示颜色
int hintTextColor = attributes.getColor(R.styleable.CustomEditTextView_edittext_hint_color, Color.BLACK);
mEditText.setHintTextColor(hintTextColor);
//获取标题显示颜色
float edittextDimension = attributes.getDimension(R.styleable.CustomEditTextView_edittext_size, 20);
// Log.w("hanshuai", "CustomEditTextView:edittextDimension==== "+edittextDimension);
mEditText.setTextSize(px2dip(context, edittextDimension));
int edittextTextColor = attributes.getColor(R.styleable.CustomEditTextView_edittext_color, Color.BLACK);
mEditText.setTextColor(edittextTextColor);
//获取标题显示颜色
int linesColor = attributes.getColor(R.styleable.CustomEditTextView_lines_color, Color.BLACK);
mLines.setBackgroundColor(linesColor);
int textviewColor = attributes.getColor(R.styleable.CustomEditTextView_textview_text_color, Color.BLACK);
mTextView.setTextColor(textviewColor);
float textviewDimension = attributes.getDimension(R.styleable.CustomEditTextView_textview_text_size, 15);
// Log.w("hanshuai", "CustomEditTextView:textviewDimension==== "+textviewDimension);
mTextView.setTextSize(px2dip(context, textviewDimension));
mTextView.setText(0 + "/" + edittextMaxNumber);
attributes.recycle();
}
}
private void intEditText(Context context) {
mEditText = new EditText(context);
LinearLayout.LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1.0f);
mEditText.setLayoutParams(lp);
mEditText.addTextChangedListener(mTextWatcher);
mEditText.setBackgroundColor(getResources().getColor(R.color.transparent));
mEditText.setGravity(Gravity.TOP);
addView(mEditText);
}
private void intLines(Context context) {
mLines = new View(context);
LinearLayout.LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, 1, 0.0f);
mLines.setLayoutParams(lp);
addView(mLines);
}
private void intTextView(Context context) {
mTextView = new TextView(context);
LinearLayout.LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 0.0f);
mTextView.setLayoutParams(lp);
mTextView.setGravity(Gravity.RIGHT);
mTextView.setPadding(0, 50, 0, 0);
addView(mTextView);
}
TextWatcher mTextWatcher = new TextWatcher() {
private CharSequence temp;
private int editStart;
private int editEnd;
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
temp = s;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
String editable = mEditText.getText().toString();
String str = stringFilter(editable);
if (!editable.equals(str)) {
Toast.makeText(context, "请输入合法字符", Toast.LENGTH_SHORT).show();
mEditText.setText(str);
//设置新的光标所在位置
mEditText.setSelection(str.length());
}
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
int nowLength = mEditText.getText().length();
mTextView.setText(nowLength + "/" + edittextMaxNumber);
if (nowLength == 0) {
mOnNumberWordsCallBack.onLessZero();
} else {
mOnNumberWordsCallBack.onGreaterZero();
}
}
};
public String getEditTextString() {
String editaString = mEditText.getText().toString();
return editaString;
}
/**
* 设置edittext 最大输入字符限制
*
* @param number 最大数量
*/
public void setEditMaxNumber(int number) {
edittextMaxNumber = number;
mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(edittextMaxNumber)});
mTextView.setText(0 + "/" + number);
}
/**
* 设置edittext 提示文本
*
* @param hintText
*/
public void setEditHintText(String hintText) {
if (!TextUtils.isEmpty(hintText)) {
mEditText.setHint(hintText);
}
}
/**
* 设置editText文本
*
* @param str
*/
public void setEditTextString(String str) {
mEditText.setText(str);
}
/**
* 匹配正则表达式,中英文数字符号
*
* @param str
* @return
* @throws PatternSyntaxException
*/
public static String stringFilter(String str) throws PatternSyntaxException {
// 只允许字母、数字和汉字标点
//String regEx = ~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?]";
String regEx = "[^a-zA-Z0-9\u4E00-\u9FA5\\p{P}]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/* public void setTitleClickListener(OnClickListener onClickListener) {
if (onClickListener != null) {
titleBarLeftBtn.setOnClickListener(onClickListener);
titleBarRightBtn.setOnClickListener(onClickListener);
}
}*/
public EditText getmEditText() {
return mEditText;
}
public View getmLines() {
return mLines;
}
public TextView getmTextView() {
return mTextView;
}
public TextWatcher getmTextWatcher() {
return mTextWatcher;
}
/**
* 输入框字数大于0和等于0
*/
public interface OnNumberWordsCallBack {
/**
* 大于0
*/
void onGreaterZero();
/**
* 等于0
*/
void onLessZero();
}
}
<declare-styleable name =“CustomEditTextView”>
<attr name =“edittext_max_number”format =“integer”/>
<attr name =“edittext_hint_text”format =“string”/>
<attr name =“edittext_color”format =“color”/>
<attr name =“edittext_size”format =“dimension”/>
<attr name =“edittext_hint_color”format =“color”/>
<attr name =“lines_color”format =“color”/>
<attr name =“textview_text_color”format =“color”/>
<attr name =“textview_text_size”format =“dimension”/>
</declare-styleable>