国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android EditText限制輸入字符的方法總結(jié)

2019-12-12 02:25:50
字體:
供稿:網(wǎng)友

 Android EditText限制輸入字符的方法總結(jié)

最近項目要求限制密碼輸入的字符類型, 例如不能輸入中文。   現(xiàn)在總結(jié)一下EditText的各種實現(xiàn)方式,  以比較各種方法的優(yōu)劣。

 第一種方式:  設(shè)置EditText的inputType屬性,可以通過xml或者Java文件來設(shè)置。假如我要設(shè)置為顯示密碼的形式,可以像下面這樣設(shè)置:

在xml中,   Android:inputType="textPassword"

在java文件中,可以用 ev.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

      inputType參數(shù)有phone、textPasswrod等等屬性, 有興趣的話可以測試一下。


第二種: 設(shè)置EditText的android:digits 屬性, 這種方式可以指出要支持的字符。比如要限制只能輸入數(shù)字和字母,可以這樣:

        android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。

PS:吐槽一下,寫著好累,不支持區(qū)間操作符~或-

第三種: 使用TextWather監(jiān)聽EditText的字符變化, 當內(nèi)容改變時刪掉不想要的字符。說白了就是用戶可以隨便按鍵盤,在代碼里馬上刪掉非法字符。 PS: 常見的搜索功能輸入框就是用TextWatcher監(jiān)測關(guān)鍵詞變化,然后查數(shù)據(jù)并顯示出來了。示例代碼:只能輸入字母或者數(shù)字, 如果要支持其它字符可以修改regEx正則表達式。

evPwd = (EditText) findViewById(R.id.ev_password);evPwd.addTextChangedListener(new TextWatcher() {  @Override  public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {  }  @Override  public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {    String editable = evPwd.getText().toString();    String regEx = "[^a-zA-Z0-9]"; //只能輸入字母或數(shù)字    Pattern p = Pattern.compile(regEx);    Matcher m = p.matcher(editable);    String str = m.replaceAll("").trim();  //刪掉不是字母或數(shù)字的字符    if(!editable.equals(str)){      evPwd.setText(str); //設(shè)置EditText的字符      evPwd.setSelection(str.length()); //因為刪除了字符,要重寫設(shè)置新的光標所在位置    }  }

第四種:通過InputFilter來實現(xiàn)。實現(xiàn)InputFilter過濾器, 需要覆蓋一個叫filter的方法。

public abstract CharSequence filter (   CharSequence source, //輸入的文字   int start, //開始位置   int end, //結(jié)束位置   Spanned dest, //當前顯示的內(nèi)容   int dstart, //當前開始位置   int dend //當前結(jié)束位置 );

注意: IntentFilter是個數(shù)組, 也就是說可以寫多個過濾條件!

下面的實現(xiàn)使得EditText只接收字符(數(shù)字、字母),Character.isLetterOrDigit會把中文也當做Letter, 所以要在寫個正則判斷是否中文。

evPwd.setFilters(new InputFilter[]{  new InputFilter() {    @Override    public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {      String regex = "^[/u4E00-/u9FA5]+$";      boolean isChinese = Pattern.matches(regex, charSequence.toString());      if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {        return "";      }      return null;    }  }});

第五種:    使用EditText的InputConnection屬性限制輸入字符。 新建個類繼承于EditText并覆蓋onCreateInputConnection函數(shù), 在xml里使用LimitText替換EditText。 

public class LimitEditText extends EditText {  public LimitEditText(Context context) {    super(context);  }  public LimitEditText(Context context, AttributeSet attrs) {    super(context, attrs);  }  public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);  }  /**   * 輸入法   * @param outAttrs   * @return   */  @Override  public InputConnection onCreateInputConnection(EditorInfo outAttrs) {    return new InnerInputConnecttion(super.onCreateInputConnection(outAttrs),        false);  }  class InnerInputConnecttion extends InputConnectionWrapper implements InputConnection {    public mInputConnecttion(InputConnection target, boolean mutable) {      super(target, mutable);    }    /**     * 對輸入的內(nèi)容進行攔截     *     * @param text     * @param newCursorPosition     * @return     */    @Override    public boolean commitText(CharSequence text, int newCursorPosition) {      // 只能輸入字母或者數(shù)字      if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {        return false;      }      return super.commitText(text, newCursorPosition);    }    @Override    public boolean sendKeyEvent(KeyEvent event) {      return super.sendKeyEvent(event);    }    @Override    public boolean setSelection(int start, int end) {      return super.setSelection(start, end);    }  }}

    以上是EditText輸入限制的所有方法, 大家如有疑問,請留言或到本站社區(qū)討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 漠河县| 宝丰县| 闻喜县| 绍兴市| 江油市| 鄂尔多斯市| 惠来县| 东丽区| 通州市| 民乐县| 滨州市| 曲周县| 永嘉县| 玉门市| 洛扎县| 太仆寺旗| 随州市| 武胜县| 唐山市| 伊金霍洛旗| 边坝县| 扎赉特旗| 凉城县| 诸城市| 忻城县| 尼木县| 东乡| 津南区| 会理县| 江永县| 名山县| 拜泉县| 宝山区| 镇坪县| 岚皋县| 两当县| 呼图壁县| 乐亭县| 沁源县| 定襄县| 衢州市|