2017-01-14 4 views
1

Я использую собственный класс EditText, который поддерживает ввод пространств изображений через пользовательский ввод для конкретного виджета и испытывает странную проблему. Когда интервал изображения отображается в конце строки, перенос на следующую строку иногда приводит к тому, что интервал изображения больше не отображается.EditText + ImageSpan исчезает при переносе на следующую строку

т.е. перед: Before the issue

после того, как я закончу, набрав "не работает." редактирование текст появляется примерно так: After issue is produce

В основном, это кажется продолжительность изображения не должным образом обработана EditText, когда речь идет о перемещении на следующую строку в многострочном EditText а. Он просто невидим для пользователя после переноса. Я могу отложить содержимое второго изображения до тех пор, пока оно не будет выглядеть точно так же, как первое изображение (до «n»), и мы снова увидим интервал изображения.

Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему? Это важный компонент, который я хотел бы оставить в своем приложении. Я также не могу отбросить один текст редактирования строки, многолинейная поддержка также имеет решающее значение.

Для воспроизводимости, вот мой код для добавления ImageSpan к моему редактирования текста:

public void appendSpannedText(String s){ 
    if (textToDrawableMap == null || textToDrawableMap.isEmpty() 
      || !textToDrawableMap.containsKey(s)) { 
     return; 
    } 

    // Acquire the mapped drawable 
    Drawable drawable = textToDrawableMap.get(s); 

    Editable editable = getText(); 
    int start = getSelectionStart(); 

    // Insert the a space at the start that's eaten by the image span 
    // being set. 
    editable = editable.insert(start, SPACE); 

    // Insert the new string at the starting point 
    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(editable); 

    // Create the span and set the new span to the appropriate range 
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); 

    int nextIdx = start + 1; 
    spannableStringBuilder.setSpan(span, 
      start, nextIdx, 
      Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    // Update the spanned text and the cursor 
    setText(spannableStringBuilder); 
    setSelection(nextIdx); 
} 

Я просто есть несколько иконок, которые пользователь может нажать и вставить'S промежуток изображение текста пользовательского редактирования с помощью spannable. Я использую сопоставление текстовых -> чертежей, которые поддерживаю, поэтому я знаю, какой из них следует использовать, когда пользователь нажимает определенную кнопку. Главное, если у вас есть обратная ссылка в редакторе, он может стать невидимым на новой строке при срабатывании.

ответ

0

Место это до setSpan:

spannableStringBuilder.append("\r"); 
+0

Вы нашли решение? У меня та же проблема. Я хотел бы здесь решить это. – rawcoder064

+0

@ rawcoder064 [link] (https://github.com/maxsav/spantest) –

+0

Я решил проблему. Проблема заключалась в том, что в текстовом режиме вырезали первое и последнее пространство. Если и добавить символ вместо пространства, он будет разрешен. Спасибо, в любом случае – rawcoder064

0

У меня была та же проблема с EditText.

Как сказано в предыдущем комментарии, это происходит из-за символа пробела. Когда EditText превращается в новую строку, компонент удаляет последний символ предыдущей строки, если это пробел. Поэтому, чтобы этого не произошло, мы должны использовать другое.

В предыдущем коде мы имели это:

editable = editable.insert(start, SPACE); 

Вместо этого, мы должны написать следующий код:

editable = editable.insert(start, anyCharacter); 

Где anyCharacter это символ, отличный от "".