封装一个可以控制字数的编辑器(EditText)!

思路:其实就是使用编辑控制器来对输入的字数和内容进行监控,达到控制字数的效果!
实现:
/**
* 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"
    >

其实算是一个挺简单的自定义控件,这样做到好处就是想用的时候可以直接拿过去就用了,很方便!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值