- 在edittext中,有时候需要动态改变文字效果,类似于一个文本编辑器中,你需要设置接下
来输入的字符是斜体,加粗,删除线等等,这时候直接对edittext是实例对象进行设置肯定是
行不通的,因为这样会使整个的文字效果发生改变。
- 这时候,我们应该新建一个EditChangedListener类来实现的TextWatcher接口中的方法来监听edittext的输入,然后进行动态的文字效果设置。
代码如下:
class EditChangedListener implements TextWatcher {
int length; //改变钱文本的长度
int startPosition; //开始的位置
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
length = s.length();
}
@Override
public void afterTextChanged(Editable s) {
if (s.toString().length() > length && s.toString().length() > 0) {
startPosition = mEtContent.getSelectionStart() - 1;
//设置加粗
if (mIbJiacu.getTag().equals("yes")) {
s.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
startPosition, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//设置斜体
if (mIbXieti.getTag().equals("yes")) {
s.setSpan(new android.text.style.StyleSpan(Typeface.ITALIC), startPosition, s
.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//设置删除线
if (mIbShanchuxian.getTag().equals("yes")) {
s.setSpan(new StrikethroughSpan(), startPosition, s.length(), Spannable
.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//设置H1大小
if (mIbBiaotiH1.getTag().equals("yes")) {
s.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
startPosition, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new RelativeSizeSpan(0.5f), startPosition, s.length(), Spannable
.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// /设置H2大小
if (mIbBiaotiH2.getTag().equals("yes")) {
s.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
startPosition, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new RelativeSizeSpan(0.75f), startPosition, s.length(), Spannable
.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//设置H3大小
if (mIbBiaotiH3.getTag().equals("yes")) {
s.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
startPosition, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new RelativeSizeSpan(1.5f), startPosition, s.length(), Spannable
.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//设置H4大小
if (mIbBiaotiH4.getTag().equals("yes")) {
s.setSpan(new RelativeSizeSpan(2.0f), startPosition, s.length(), Spannable
.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
startPosition, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
顾名思义,beforeTextChanged(CharSequence s, int start, int before, int count)方法是
在文本变化之前被调用,onTextChanged(CharSequence s, int start, int count,=int after)
方法则在文本改变时调用,afterTextChanged(Editable s)方法在文本改变后被调用。
在afterTextChanged方法中,根据Editable s中的s.setSpan()方法,就可以实现动态改变文
字的效果了。当然,最后不要忘了给edittext加入监听。
mEtContent.addTextChangedListener(new EditChangedListener());
- 注意,在afterTextChanged(Editable s)方法中,如果你想改变文本的内容,即s的内容,
你必须严格控制好改变发生前的判断条件,否则文本改变后它又会从 beforeTextChanged开
始执行这三个方法,最终会陷入无限循环之中。