3

我使用這個庫材料EDITTEXT與標籤: https://github.com/rey5137/Material/wiki/Text-Field 好的庫:)IndexOutOfBoundsException異常setSpan(0 ... 1)結束以後長度爲0

但是......

我使用下一我使用textWatcher

private boolean hasCorrectSymbols(String input){ 
     String tre = "[A-Za-z0-9\\@\\#\\$\\%\\&\\*\\(\\)\\-\\+\\_\\;\\:\\?\\.\\,\\!]+$"; 
     if (input.matches(tre)){ 
      return true; 
     } 
     return false; 
    } 

檢查正確的符號:代碼查詢中輸入符號正確

mEditPass.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       if (s.length() == 1 && !loginPassHasCorrectSymbols(s.toString())){ 
        mEditPass.getText().clear(); 
        String mess = getString(R.string.toast_login_useLatin); 
        showToastMessage(mess); 
       } else if (s.length() >1 && !loginPassHasCorrectSymbols(s.toString())) { 
        String mess = getString(R.string.toast_login_useLatin); 
        showToastMessage(mess); 
        String text = s.toString(); 
        text = text.substring(0, start); 
        mEditPass.setText(text); 
        mEditPass.setSelection(start); 
       } 
      } 

      @Override 
      public void afterTextChanged(Editable s) {} 
     }); 

如果第一個符號是正確的,第二個符號是錯誤的 - 系統會剪切最後輸入的(錯誤)符號並將光標設置爲最後一個文本位置,但是如果第一個符號是禁止符號 - 錯誤:

java.lang.IndexOutOfBoundsException: setSpan (0 ... 1) ends beyond length 0 
      at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1016) 
      at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592) 
      at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588) 
      at android.text.method.PasswordTransformationMethod.onTextChanged(PasswordTransformationMethod.java:108) 
      at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962) 
      at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496) 
      at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435) 
      at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30) 
      at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:683) 
      at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:198) 
      at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183) 
      at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:279) 
      at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5097) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

任何想法爲什麼會發生?以及如何解決這個問題?

回答

3

在此代碼段,可以縮短在EditText顯示的文本(以便最後一個有效位置是start-1),但還是儘量選擇位置設置爲start

   text = text.substring(0, start); 
       mEditPass.setText(text); 
       mEditPass.setSelection(start); 

將帖子

假設你的吐司消息提示用戶修復錯誤,我想你真正想要做的是要選擇一個設定的第一個字符中的EditText壞符號。下面是這樣做的示例代碼:

// A reusable Pattern (at the class level) that defines the regex for bad characters. 
private static final Pattern ILLEGAL_CHAR_PATTERN = Pattern.compile(
    "[^A-Za-z0-9\\@\\#\\$\\%\\&\\*\\(\\)\\-\\+\\_\\;\\:\\?\\.\\,\\!]" 
); 

    // Replacement for your listener code. 
    mEditPass.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (s.length() == 0 || count == 0) { 
       return; 
      } 
      Matcher matcher = ILLEGAL_CHAR_PATTERN.matcher(s); 
      if (matcher.find()) { 
       int firstIllegalPos = matcher.start(); 
       mEditPass.setSelection(firstIllegalPos); 
       String mess = getString(R.string.toast_login_useLatin); 
       showToastMessage(mess); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }); 
+0

nope,它在第一個符號錯誤時崩潰,並在此處崩潰: mEditPass.getText()。clear(); String mess = getString(R.string.toast_login_useLatin); showToastMessage(mess); –

+0

堆棧跟蹤顯示系統處理消息時發生異常。事故發生時,你的代碼根本就不在堆棧中。 – cybersam

+1

那麼如何解決這個問題? –

0

此問題已修復中加入下面的代碼:

mEditPass.getText().clearSpans(); 

mEditPass.getText().clear(); 
0

的錯誤說你結束前spanable文字的開始,尋找你給出的任何字符,並在開始之前出現

相關問題