项目需要EditText只能输入固定行高的内容,超出部分要删掉,本以为很简单,设置个属性就行了结果发现不是那样的,maxLength,maxLines,lines这些都不行,后来查了资料发现,没有方法可以删除多余的文本,那只能自己写监听了,在文本长度发生变化时候判断是否大于要设置的,超出的话直接,删掉,这样就可以递归下去,直到删到指定行数.原理就是这样的 .先看效果图
在实际操作的时候,发现在onTextChanged()只能获取到一次行高,第二次递归时就是0.查了资料 发现是因为EditText需要把文本绘制上去后才能获取到行高,刚设置上去之后还没有绘制完成, 这就和onCreat获取不到textView高度是一样的,查了资料,可以用android.os.AsyncTask这个类执行异步任务,在onPostExecute方法中可以获取 到.当获取到高度后在进行判断就是否删除多余的文本.这个方法比较简单.(也可以用其他方式和onCreat获取textView 高度是一样的,在绘制完成后进行获取)
/**
*
* @author 王瑜 ake
*有兴趣的可以自己封装成一个自定义控件
*/
public class TestActivity extends Activity {
private EditText et_content;
private int MaxLine=5; //最大行数,超过会自动删除多余文本
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edittext);
et_content = (EditText) findViewById(R.id.editText1);
MyTextWatcher textWatcher=new MyTextWatcher();
et_content.addTextChangedListener(textWatcher);
}
// EditText 的监听
public class MyTextWatcher implements 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) {
// 限制最大输入行数
if (et_content.getLineCount() > MaxLine) {
deleteExtra();
return;
}else {//这里会交替执行if else也可以把if去掉,但是效率太低了
MyOpenTask tast=new MyOpenTask();
tast.execute();
}
}
@Override
public void afterTextChanged(Editable s) {
}
}
//检查是否超过MaxLine的异步任务
private class MyOpenTask extends AsyncTask
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected Integer doInBackground(Integer... params) {
return 1;
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
if(et_content.getLineCount()>MaxLine){
deleteExtra();
}
}
}
//每次删除5个字符,可以根据情况更改,每次删一个效率太低
private void deleteExtra() {
String str = et_content.getText().toString();
str =str.substring(0,str.length()-5);
// setText会触发afterTextChanged的递归
et_content.setText(str);
et_content.setSelection(et_content.getText().length());
}
}
相关的布局文件:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.test.TestActivity" >
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:minHeight="100dp"
android:lines="8"
android:maxLines="8"
android:gravity="left"
android:inputType="textMultiLine"
>
参考:
EditText 属性http://blog.csdn.net/lovexjyong/article/details/6852529
android:maxLength限制显示的文本长度,超出部分不显示。
android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。
android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。
android:minLines设置文本的最小行数,与lines类似。
onCreat获取textView高度的N种方式
http://blog.csdn.net/lvshaorong/article/details/51077938