Android EditText设置固定行高,自动删除超出文本

来源:互联网 发布:网络本统考的时间 编辑:程序博客网 时间:2024/05/17 02:50

项目需要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<Integer, Integer, Integer> {  
 
      @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());
}  
}


相关的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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" >


    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />


    <EditText
        android:id="@+id/editText1"
        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"
        >


        <requestFocus />
    </EditText>


</RelativeLayout>


参考:
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

0 0