2014-07-15 9 views
9

Jeśli skopiuję/wkleję tekst z Chrome na Androida do mojego widoku EditText, zostanie on pomieszany, najwyraźniej ze względu na formatowanie tekstu sformatowanego.Wklej bez formatowania tekstu sformatowanego do EditText

The font size is totally messed up and not that big http://erikmi.tk/WaeG/image.png

Czy istnieje sposób, aby powiedzieć pogląd EditText ignorować formatowanie tekstu? Czy mogę złapać wydarzenie wklejania i usunąć je, zanim zostanie ono ustawione? Jak to zrobić?

UPDATE: więc zdałem sobie sprawę, że editText.getText() daje mi SpannableString który zawiera niektóre elementy formatowania. Mogę się tego pozbyć, dzwoniąc pod numer .clearSpans();. ALE nie mogę zrobić czegoś takiego w editText.addTextChangedListener(new TextWatcher() { … }, ponieważ robi się strasznie wolno, a interfejs użytkownika aktualizuje się tylko wtedy, gdy opuszczam widok editText.

+0

To wygląda jakby rozumie EditText Formatowanie rtf, ponieważ nie widać tekstu źródłowego rtf. Proszę wytłumacz. Co otrzymasz z editText.getText()? Formowany tekst? – greenapps

+0

Przypadkiem użycia jest to, że ktoś poszedł na Amazon.com (edycja: w Chrome na Androida), szukał książki i skopiował/wkleił tytuł w polu EditText. Wtedy zamiast zwykłego rozmiaru robi się tak duży. Jak używać getText() po wklejeniu? Nie mogę tego zrobić z debuggera, prawda? – Erik

+0

????? Stwórz przycisk lub element menu, który to robi. Lub ustaw na detektor zmian dla tekstu edycji, który wyświetla toast. Możesz od razu "wyczyścić" tekst. 'addTextChangedListener'. – greenapps

Odpowiedz

6

Problem z clearSpans() polegał na tym, że usunięto go zbyt wiele, a editText zachowuje się dziwnie później. Postępując zgodnie z podejściem w this answer, usuwam tylko MetricAffectingSpan i działa to dobrze.

public void afterTextChanged(Editable string) 
{ 
    CharacterStyle[] toBeRemovedSpans = string.getSpans(0, string.length(), 
               MetricAffectingSpan.class); 
    for (int index = 0; index < toBeRemovedSpans; index++) 
     string.removeSpan(toBeRemovedSpans[index]); 
    } 
} 
+2

'editText.getText(). Length()' Ohhh thats not nice! Spróbuj 's.length()'. – greenapps

+0

Dobra uwaga. Zmieniono to. :) – Erik

3

Doskonałym i łatwy sposób: przesłonić EditText „s onTextContextMenuItem i przechwycić android.R.id.paste być android.R.id.pasteAsPlainText

@Override 
public boolean onTextContextMenuItem(int id) { 
    if (id == android.R.id.paste) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      id = android.R.id.pasteAsPlainText; 
     } else { 
      onInterceptClipDataToPlainText(); 
     } 
    } 
    return super.onTextContextMenuItem(id); 
} 


private void onInterceptClipDataToPlainText() { 
    ClipboardManager clipboard = (ClipboardManager) getContext() 
     .getSystemService(Context.CLIPBOARD_SERVICE); 
    ClipData clip = clipboard.getPrimaryClip(); 
    if (clip != null) { 
     for (int i = 0; i < clip.getItemCount(); i++) { 
      final CharSequence paste; 
      // Get an item as text and remove all spans by toString(). 
      final CharSequence text = clip.getItemAt(i).coerceToText(getContext()); 
      paste = (text instanceof Spanned) ? text.toString() : text; 
      if (paste != null) { 
       ClipBoards.copyToClipBoard(getContext(), paste); 
      } 
     } 
    } 
} 

A copytoclipboard:

public class ClipBoards { 

    public static void copyToClipBoard(@NonNull Context context, @NonNull CharSequence text) { 
     ClipData clipData = ClipData.newPlainText("rebase_copy", text); 
     ClipboardManager manager = (ClipboardManager) context 
      .getSystemService(Context.CLIPBOARD_SERVICE); 
     manager.setPrimaryClip(clipData); 
    } 
} 
Powiązane problemy