2017-07-08 29 views
0

我已經實現了一個可以帶粗體,斜體,下劃線文本的自定義EditText。 一切工作正常,除非我嘗試通過長按退格按鈕來刪除文本。在長時間按下退格鍵時,清除文本會有延遲。自定義EditText凍結使用退格鍵清除文本

這裏是被覆蓋的onTextChanged()方法

protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { 

    Log.d(VIEW_LOG_TAG,"Start: "+start+" Length before: "+lengthBefore+" Length After: "+lengthAfter+" TextLength: "+text.length()); 
    Spannable str = this.getText(); 
    CharacterStyle ss; 
    UnderlineSpan ss1=null; 
    int endLength = text.toString().length(); 

    switch (currentTypeface) { 
     case TYPEFACE_NORMAL: 
      ss = new StyleSpan(Typeface.NORMAL); 
      break; 
     case TYPEFACE_BOLD: 
      ss = new StyleSpan(Typeface.BOLD); 
      break; 
     case TYPEFACE_ITALICS: 
      ss = new StyleSpan(Typeface.ITALIC); 
      break; 
     case TYPEFACE_BOLD_ITALICS: 
      ss = new StyleSpan(Typeface.BOLD_ITALIC); 
      break; 
     case TYPEFACE_UNDERLINE: 
      ss= new UnderlineSpan(); 
      break; 
     case TYPEFACE_BOLD_UNDERLINE: 
      ss = new StyleSpan(Typeface.BOLD); 
      ss1=new UnderlineSpan(); 
      break; 
     case TYPEFACE_ITALICS_UNDERLINE: 
      ss = new StyleSpan(Typeface.ITALIC); 
      ss1=new UnderlineSpan(); 
      break; 
     case TYPEFACE_BOLD_ITALICS_UNDERLINE: 
      ss = new StyleSpan(Typeface.BOLD_ITALIC); 
      ss1=new UnderlineSpan(); 
      break; 
     default: 
      ss = new StyleSpan(Typeface.NORMAL); 
    } 
     if(lastCursorPosition>endLength) 
      return; 
     Log.d(TextArea.class.getSimpleName(), new Integer(lastCursorPosition).toString() + new Integer(endLength).toString()); 
    if(ss1!=null) 
     str.setSpan(ss1, lastCursorPosition, endLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     str.setSpan(ss, lastCursorPosition, endLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 
+0

你的'button'和'setOnLongClickListener'在哪裏? –

+0

@MehranZamani他在談論鍵盤 - 他不會有按鈕或點擊監聽器,鍵盤應用程序會。 –

回答

1

這並不是的EditText,其TextWatcher的函數的函數。你並沒有製作自定義的EditText,而是試圖做一個快速的黑客來避免製作自定義的EditText。區別很重要,因爲您的技術缺乏創建真正的自定義編輯文本所具有的許多功能。其次,你確定延遲不在鍵盤上嗎?長按鍵的典型技術與短按不同的是延遲動作。許多鍵盤甚至允許您自定義延遲(例如,參見Swype)。所以它可能不是你的代碼延遲它的鍵盤的內置功能。 (我認爲這是最可能的答案)。

第三,你真的在​​做事,效率低下。每次調用時都不應該創建新的Spans。您應該在創建時創建一組跨度,並在每次調用時重用它們。如果這是你的表現,那麼這將會給你一個很好的加速。

+0

這是導致問題的第三個問題。我在開始時創建了它們,並按照您的說法重新使用了它們,並解決了問題。非常感謝你:) –

+0

重複使用跨度解決了問題,但創建了另一個,因爲我在這個問題中提出了https://stackoverflow.com/q/44998227/5045878。請回復 ;( –