2014-07-15 25 views
9

Nếu tôi sao chép/dán văn bản từ Chrome dành cho Android vào chế độ xem EditText, nó sẽ bị rối tung lên, rõ ràng là do định dạng văn bản đa dạng thức.Dán mà không có định dạng văn bản đa dạng thức thành EditText

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

Có cách nào để nói với cái nhìn EditText để bỏ qua định dạng văn bản phong phú? Hoặc tôi có thể nắm bắt sự kiện dán và xóa nó trước khi nó được thiết lập? Tôi sẽ làm như thế nào?

UPDATE: Vì vậy, tôi nhận ra rằng editText.getText() mang lại cho tôi một SpannableString có chứa một số định dạng. Tôi có thể loại bỏ điều đó bằng cách gọi số .clearSpans(); trên đó. NHƯNG Tôi không thể làm bất cứ điều gì tương tự như vậy trong editText.addTextChangedListener(new TextWatcher() { … } vì nó bị chậm khủng khiếp và giao diện người dùng chỉ cập nhật khi tôi rời khỏi chế độ xem editText.

+0

Có vẻ như nếu EditText hiểu rtf định dạng như không có văn bản nguồn rtf được nhìn thấy. Vui lòng giải thích. Bạn nhận được gì với editText.getText()? Văn bản được định dạng? – greenapps

+0

Trường hợp sử dụng là ai đó đã truy cập Amazon.com (chỉnh sửa: với Chrome dành cho Android), tìm kiếm một cuốn sách và sao chép/dán tiêu đề trong trường EditText. Sau đó, thay vì kích thước thông thường nó được lớn. Làm thế nào để sử dụng getText() sau khi dán đã xảy ra? Tôi không thể làm điều đó từ trình gỡ lỗi, phải không? – Erik

+0

????? Tạo một nút hoặc một mục menu để thực hiện điều đó. Hoặc đặt trình xử lý thay đổi cho văn bản chỉnh sửa hiển thị bánh mì nướng. Bạn có thể ngay lập tức 'clean'the văn bản sau đó. 'addTextChangedListener'. – greenapps

Trả lời

6

Sự cố với clearSpans() là sự cố đã xóa quá nhiều và editText hoạt động lạ sau đó. Bằng cách làm theo cách tiếp cận trong this answer Tôi chỉ xóa MetricAffectingSpan và nó hoạt động tốt sau đó.

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! Hãy thử 's.length()'. – greenapps

+0

Điểm tốt. Thay đổi điều đó. :) – Erik

3

Một cách hoàn hảo và dễ dàng: Ghi đè 's onTextContextMenuItemEditText chặn các android.R.id.pasteandroid.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); 
      } 
     } 
    } 
} 

Và 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); 
    } 
} 
Các vấn đề liên quan