Android EditText输入最大长度限制如何给用户以友好的提示

参考:

http://www.codes51.com/article/detail_156877.html


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

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

然后我写个小示例,xml布局如下:


<LinearLayout xmlns:android="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;
 
publicclass MainActivity extends Activity { 
    
    private EditText editText = null;
    private Toast toast = null;
    
    @Override 
    publicvoid 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 
        publicvoid beforeTextChanged(CharSequence s, int start, int count,  
                int after) {  
            //TODO        }  
        @Override    
        publicvoid onTextChanged(CharSequence s, int start, int before,     
                int count) {     
            //TODO        }
         @Override    
         publicvoid 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;
 
publicclass MainActivity extends Activity { 
    
    private EditText editText = null;
    private Toast toast = null;
    
    @Override 
    publicvoid 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{
        
        privateint 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 "";
            }elseif(keep >= end - start){
                returnnull;
            }else{
                return source.subSequence(start,start + keep);
            }
        }
    }
} 
自定义类实现InputFilter,在filter方法中做长度判断,这样一来,当达到最大长度之后,继续输入字符的话,则每次都会弹toast提示。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值