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

首頁 > 系統 > Android > 正文

Android EditText限制輸入字符的方法總結

2019-10-22 18:31:51
字體:
來源:轉載
供稿:網友

 Android EditText限制輸入字符的方法總結

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

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

在xml中,   Android:inputType="textPassword"

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

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

Android,EditText限制輸入字符,EditText限制輸入字符的五種方法,EditText

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

        android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。

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

第三種: 使用TextWather監聽EditText的字符變化, 當內容改變時刪掉不想要的字符。說白了就是用戶可以隨便按鍵盤,在代碼里馬上刪掉非法字符。 PS: 常見的搜索功能輸入框就是用TextWatcher監測關鍵詞變化,然后查數據并顯示出來了。示例代碼:只能輸入字母或者數字, 如果要支持其它字符可以修改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]"; //只能輸入字母或數字    Pattern p = Pattern.compile(regEx);    Matcher m = p.matcher(editable);    String str = m.replaceAll("").trim();  //刪掉不是字母或數字的字符    if(!editable.equals(str)){      evPwd.setText(str); //設置EditText的字符      evPwd.setSelection(str.length()); //因為刪除了字符,要重寫設置新的光標所在位置    }  }

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

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

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

下面的實現使得EditText只接收字符(數字、字母),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函數, 在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);    }    /**     * 對輸入的內容進行攔截     *     * @param text     * @param newCursorPosition     * @return     */    @Override    public boolean commitText(CharSequence text, int newCursorPosition) {      // 只能輸入字母或者數字      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輸入限制的所有方法, 大家如有疑問,請留言或到本站社區討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平罗县| 乡宁县| 武邑县| 永吉县| 孝义市| 台东县| 临武县| 图片| 西青区| 郎溪县| 嘉荫县| 天长市| 长乐市| 班玛县| 云龙县| 谷城县| 高邮市| 阿瓦提县| 青海省| 延津县| 沙河市| 慈利县| 库车县| 塔河县| 如皋市| 汉川市| 沁阳市| 奉化市| 务川| 古蔺县| 新邵县| 樟树市| 达拉特旗| 南昌市| 精河县| 舒兰市| 万源市| 且末县| 雷山县| 资兴市| 莱芜市|