思路:其实就是使用编辑控制器来对输入的字数和内容进行监控,达到控制字数的效果!
实现:
/**
* Created by ML on 2017/1/5.
*/
public class EditTextShowNum extends LinearLayout {
private LayoutInflater mInflater;
private LinearLayout llView;
private EditText etText;
private TextView textNumber;
private TextWatcher mWatcher; //编辑控制器
private String content;
private int maxWord;
private int levelOneNum;
private int levelTwoNum;
private int levtlOneColor;
private int levelTwoColor;
private float edittextSize;
private int edittextColor;
private float numtextSize;
private int numtextMaxColor;
private int numtextColor;
private String edittexthint;
public EditTextShowNum(Context context) {
super(context);
}
public EditTextShowNum(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TextNum);
maxWord = typedArray.getInt(R.styleable.TextNum_maxWord, 500);
edittextSize = typedArray.getFloat(R.styleable.TextNum_edittextSize, 15.0f);
numtextSize = typedArray.getFloat(R.styleable.TextNum_numtextSize, 15.0f);
edittextColor = typedArray.getInt(R.styleable.TextNum_edittextColor, 0x383838);
numtextColor = typedArray.getInt(R.styleable.TextNum_numtextColor, 0xb3b3b3);
numtextMaxColor = typedArray.getInt(R.styleable.TextNum_numtextMaxColor, 0xFF0000);
edittexthint = typedArray.getString(R.styleable.TextNum_edittexthint);
levelOneNum = typedArray.getInt(R.styleable.TextNum_levrlOneNum, 0);
levelTwoNum = typedArray.getInt(R.styleable.TextNum_levelTwoNum, 0);
levtlOneColor = typedArray.getInt(R.styleable.TextNum_levtlOneColor, 0xf89527);
levelTwoColor = typedArray.getInt(R.styleable.TextNum_levelTwoColor, 0xfc6e42);
if (levelOneNum != 0 && levelTwoNum != 0) {
if (levelOneNum > levelTwoNum) {
int num = levelTwoNum;
levelTwoNum = levelOneNum;
levelOneNum = num;
}
}
mInflater = LayoutInflater.from(context);
initXMLView();
}
private void initXMLView() {
View view = mInflater.inflate(R.layout.edittext_num, this, false);
llView = (LinearLayout) view.findViewById(R.id.ll_view);
etText = (EditText) view.findViewById(R.id.et_text);
etText.setTextSize(edittextSize);
etText.setTextColor(edittextColor);
textNumber = (TextView) view.findViewById(R.id.text_number);
textNumber.setTextSize(numtextSize);
textNumber.setTextColor(numtextColor);
textNumber.setText("0/" + maxWord);
if (edittexthint != null && edittexthint != "") {
etText.setHint(edittexthint);
}
mWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int number = Integer.valueOf(s.length());
if (number > maxWord) {
Toast.makeText(getContext(), "已到达最大字数!", Toast.LENGTH_SHORT).show();
etText.setText(content);
if (content != null && content != "") {
etText.setSelection(content.length());
}
textNumber.setText(Html.fromHtml("<font color='" + numtextMaxColor + "'>" + maxWord + "</font>" + "/" + maxWord));
} else if (levelTwoNum != 0 && number > levelTwoNum) {
content = s.toString();
textNumber.setText(Html.fromHtml("<font color='" + levelTwoColor + "'>" + s.length() + "</font>" + "/" + maxWord));
} else if (levelOneNum != 0 && number > levelOneNum) {
content = s.toString();
textNumber.setText(Html.fromHtml("<font color='" + levtlOneColor + "'>" + s.length() + "</font>" + "/" + maxWord));
} else {
content = s.toString();
textNumber.setText(Html.fromHtml("<font color='" + numtextColor + "'>" + s.length() + "/" + maxWord + "</font>"));
}
}
};
etText.addTextChangedListener(mWatcher);
this.addView(llView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public EditText getEtText() {
return etText;
}
public void setEtText(EditText etText) {
this.etText = etText;
}
public TextView getTextNumber() {
return textNumber;
}
public void setTextNumber(TextView textNumber) {
this.textNumber = textNumber;
}
public int getMaxWord() {
return maxWord;
}
public void setMaxWord(int maxWord) {
this.maxWord = maxWord;
}
public int getLevelOneNum() {
return levelOneNum;
}
public void setLevelOneNum(int levelOneNum) {
this.levelOneNum = levelOneNum;
}
public int getLevelTwoNum() {
return levelTwoNum;
}
public void setLevelTwoNum(int levelTwoNum) {
this.levelTwoNum = levelTwoNum;
}
public int getLevtlOneColor() {
return levtlOneColor;
}
public void setLevtlOneColor(int levtlOneColor) {
this.levtlOneColor = levtlOneColor;
}
public int getLevelTwoColor() {
return levelTwoColor;
}
public void setLevelTwoColor(int levelTwoColor) {
this.levelTwoColor = levelTwoColor;
}
public float getEdittextSize() {
return edittextSize;
}
public void setEdittextSize(float edittextSize) {
this.edittextSize = edittextSize;
}
public int getEdittextColor() {
return edittextColor;
}
public void setEdittextColor(int edittextColor) {
this.edittextColor = edittextColor;
}
public float getNumtextSize() {
return numtextSize;
}
public void setNumtextSize(float numtextSize) {
this.numtextSize = numtextSize;
}
public int getNumtextMaxColor() {
return numtextMaxColor;
}
public void setNumtextMaxColor(int numtextMaxColor) {
this.numtextMaxColor = numtextMaxColor;
}
public int getNumtextColor() {
return numtextColor;
}
public void setNumtextColor(int numtextColor) {
this.numtextColor = numtextColor;
}
public String getEdittexthint() {
return edittexthint;
}
public void setEdittexthint(String edittexthint) {
this.edittexthint = edittexthint;
}
这里是封装的所有代码,上面还自定义了一些控件属性,为了方便在XML生命控件时使用!
<declare-styleable name="TextNum">
<!--最大编辑字数-->
<attr name="maxWord" format="integer"/>
<!--达到最大值时数字文本显示的颜色-->
<attr name="numtextMaxColor" format="color|integer"/>
<!--编辑器字体的大小-->
<attr name="edittextSize" format="float"/>
<!--编辑器字体的颜色-->
<attr name="edittextColor" format="color|integer"/>
<!--编辑器没有内容是显示的提示语-->
<attr name="edittexthint" format="string"/>
<!--数字文本显示的颜色-->
<attr name="numtextColor" format="color|integer"/>
<!--数字文本的字体大小-->
<attr name="numtextSize" format="float"/>
<!--编辑字数到达一等级的级别值,可以不设置)-->
<attr name="levrlOneNum" format="integer"/>
<!--编辑字数到达二等级的级别值,可以不设置)-->
<attr name="levelTwoNum" format="integer"/>
<!--编辑字数到达一等级时数字文本显示的颜色,可以不设置,当一等级级别值和二等级的级别值相同时,取二等级的颜色值)-->
<attr name="levtlOneColor" format="color|integer"/>
<!--编辑字数到达二等级时数字文本显示的颜色,可以不设置)-->
<attr name="levelTwoColor" format="color|integer"/>
</declare-styleable>
接下来在XML资源文件中声明使用就可以了:
<com.example.a20161005.custormview.v5.EditTextShowNum
android:layout_width="match_parent"
android:layout_height="match_parent"
num:edittextColor="#383838"
num:edittextSize="15"
num:edittexthint="这是一个可以控制字数的编辑器"
num:levelTwoNum="0"
num:levrlOneNum="10"
num:maxWord="50"
num:numtextColor="#b3b3b3"
num:numtextSize="15"
>
其实算是一个挺简单的自定义控件,这样做到好处就是想用的时候可以直接拿过去就用了,很方便!