你的位置:首页 > 操作系统

[操作系统]Android EditText输入最大长度限制如何给用户以友好的提示


我们知道EditText有个属性android:maxLength="xxx" ,可以设置EditText的最大长度。

也可以用如下代码设置长度,editText.setFilters( new  InputFilter[]{ new  InputFilter.LengthFilter( 50 )});  

 

然后我写个小示例,

<LinearLayout ="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_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"  >   <TextView    android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="请输入:"     />  <EditText      android:id="@+id/editText"     android:layout_width="fill_parent"      android:layout_height="wrap_content"    android:maxLength="15"    /> </LinearLayout>

View Code

设置最大长度为15

MainActivity 如下:

package com.example.edittext;import android.app.Activity;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.Gravity;import android.widget.EditText;import android.widget.Toast; public class MainActivity extends Activity {     private EditText editText = null;  private Toast toast = null;    @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     editText = (EditText)findViewById(R.id.editText);     editText.addTextChangedListener(textWatcher);   }      private TextWatcher textWatcher = new TextWatcher() {          @Override     public void beforeTextChanged(CharSequence s, int start, int count,         int after) {       //TODO    }     @Override      public void onTextChanged(CharSequence s, int start, int before,           int count) {         //TODO    }     @Override       public void afterTextChanged(Editable s) {         Log.d("TAG","afterTextChanged  "+"str="+s.toString());       int len = s.toString().length();       if(len>=15){         toast = Toast.makeText(getApplicationContext(), "字符不能超过15个", 1000);         toast.setGravity(Gravity.TOP, 0, 235);         toast.show();      }     }  }; } 

我们给EditText加上textChanged监听器,并在afterTextChanged中对已经输入文本的长度进行判断,当长度大于或者等于15时

我们给出提示字符不能超过15个,如下图、

 

但是,问题来了。提示完字符不能超过15个之后,假设我们再进行输入操作,这时候就不再提示了。

假设用户没有注意到弹的toast,而超过15个字符后用户还在输入,但是文本框却没有变化,造成体验就不好了。

 

我们希望的是超过15个字符后用户如果继续输入,我们依旧每次都提示他字符不能超过15个。

我们修改代码如下,

package com.example.edittext;import android.app.Activity;import android.os.Bundle;import android.text.InputFilter;import android.text.Spanned;import android.view.Gravity;import android.widget.EditText;import android.widget.Toast; public class MainActivity extends Activity {     private EditText editText = null;  private Toast toast = null;    @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     editText = (EditText)findViewById(R.id.editText);         editText.setFilters(new InputFilter[]{new MaxTextLengthFilter(16)});  }        class MaxTextLengthFilter implements InputFilter{        private int mMaxLength;        public MaxTextLengthFilter(int max){      mMaxLength = max - 1;      toast = Toast.makeText(MainActivity.this,"字符不能超过15个",1000);      toast.setGravity(Gravity.TOP, 0, 235);    }        public CharSequence filter(CharSequence source, int start, int end,         Spanned dest, int dstart ,int dend){      int keep = mMaxLength - (dest.length() - (dend - dstart));      if(keep < (end - start)){        toast.show();      }      if(keep <= 0){        return "";      }else if(keep >= end - start){        return null;      }else{        return source.subSequence(start,start + keep);      }    }  }} 

 

自定义类实现InputFilter,在filter方法中做长度判断,这样一来,当达到最大长度之后,继续输入字符的话,则每次都会弹toast提示。