2014-09-20 63 views
3

也許這已經回答了,但是我在SO上找不到它。EditText中的maxLength屬性不能像預期的那樣通過xml和java工作

我有一個非常簡單的要求:限制EditText中字符的長度。

我在這裏使用了xml中的maxLength標籤。 奇怪的是,如果輸入文本的長度超過了指定的限制,則通過軟鍵盤按退格鍵不能刪除文本。輸入的文本保留在EditText字段中。關閉並重新打開軟keayboard後,文本變爲「可刪除」。

<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"> 

    <EditText 
     android:id="@+id/edit" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:maxLength="5" 
     android:hint="text"/> 
</RelativeLayout> 

添加此佈局足以獲得所描述的行爲。

我加了一個InputFilter來看看這裏發生了什麼。沒有InputFilter,所描述的結果將是相同的!

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    EditText et = (EditText) findViewById(R.id.edit); 

    InputFilter filter = new InputFilter() { 
     @Override 
     public CharSequence filter(CharSequence source, 
       int start, 
       int end, 
       Spanned dest, 
       int dstart, 
       int dend) { 

      if (source != null) { 
       Log.v("edit","source = " + source.toString()); 
       Log.v("edit","start = " + start); 
       Log.v("edit","end = " + end); 
      } 
      if (dest != null) { 
       Log.v("edit","dest= " + dest.toString()); 
       Log.v("edit","dstart = " + dstart); 
       Log.v("edit","dend = " + dend); 
      } 
      return null; 
     } 
    }; 

    InputFilter[] oldFilters = et.getFilters(); 
    InputFilter[] newFilters = new InputFilter[oldFilters.length + 1]; 
    System.arraycopy(oldFilters, 0, newFilters, 0, oldFilters.length); 
    newFilters[oldFilters.length] = filter; 
    et.setFilters(newFilters); 
} 

雖然記錄我可以看到source將保持不變,如果超過maxLength,但跨區dest改變應該的方式,按退格鍵刪除文本字符。

現在這裏發生了什麼?這是一個錯誤還是真正的默認行爲。因爲如果用戶鍵入他的文本並超過了限制,他沒有機會糾正。

編輯:

通過桑迪普·庫馬爾使用Java代碼來設置最大長度會導致同樣的結果建議的方式。

et.setFilters(new InputFilter[]{new InputFilter.LengthFilter(5)}); 

順便說一句,我正在使用Android API 4.4.2和SDK 23.0.2。

+0

你有沒有解決這個?我遇到了同樣的問題,我來到這裏尋找答案。很高興它不只是我。 – SilentByte 2015-02-21 21:31:44

+0

@StayFrosty它仍然沒有解決。主要的事實是,我不能再放任何時間了。 – 2015-03-08 10:23:05

回答

0
TextView editEntryView = new TextView(...); 
InputFilter[] filterArray = new InputFilter[1]; 
filterArray[0] = new InputFilter.LengthFilter(8); 
editEntryView.setFilters(filterArray); 

如果此代碼有用,請投票!

+1

這產生了相同的結果。如果maxLength超過,則按下退格鍵,EditText中的字符保持不變。 – 2014-09-20 13:00:41

0

什麼工作對我來說是使用長度限制textwatcher如下,並使用textNoSuggestions作爲的inputType

public class LengthTextWatcher implements TextWatcher { 

    String prevVal = ""; 
    int length; 
    public LengthTextWatcher(int l) { 
     length = l; 
    } 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 

    @Override 
    public void afterTextChanged(Editable s) { 
     if(s != null && s.length() > 0) { 
      if(s.length() > length) { 
       s.clear(); 
       s.insert(0, prevVal); 
      } 
      prevVal = s.toString(); 
     } 
    } 
} 

... 

樣品辦法適用textWatcher

mFirstNameET.addTextChangedListener(new LengthTextWatcher(35)); 

而且

android:inputType="textNoSuggestions" 
相關問題