2012-08-09 26 views
6

Trong ứng dụng của tôi, tôi sử dụng phương thức Html.fromHtml (chuỗi) .toString để xóa một số thẻ <p> được nhận khi tôi phân tích cú pháp một số JSON.HTML.fromHtml thêm không gian ở cuối văn bản?

Nếu tôi để thẻ <p> bật, văn bản phù hợp với nền hoàn hảo (nền là bố cục tương đối với wrap_content ở cả chiều cao và chiều rộng.) Tuy nhiên, nếu tôi sử dụng fromHtml để xóa các thẻ <p>, đột nhiên có một không gian lớn bên dưới văn bản, mà tôi tin là phương pháp fromHtml thêm vào không gian ở cuối?

Bất kỳ ý tưởng nào?

EDIT:

Dưới đây là ảnh chụp màn hình: http://imgur.com/a/zIZNo

Một với <p> thẻ là một trong đó doesnt sử dụng fromHtml, rõ ràng! :)

EDIT 2: Giải pháp đã được tìm thấy, xem câu trả lời của tôi bên dưới. Cảm ơn Andro Selva đã giúp tôi bằng cách nói cho tôi biết về số /n bị ẩn đã được thêm vào!

+0

bất kỳ ảnh chụp màn hình nào liên quan đến sự khác biệt sẽ hữu ích tôi đoán –

+0

thêm ảnh chụp màn hình! –

Trả lời

8

Giải pháp đã được tìm thấy:

fromHtml trả về kiểu Spanned. Vì vậy, tôi đã gán những gì đã được trả về một biến, chuyển đổi nó thành một chuỗi và sau đó sử dụng phương thức .trim() trên nó.

Xóa tất cả khoảng trắng ở cuối.

+0

Hoạt động hoàn hảo. –

+0

hoạt động như một sự quyến rũ. Thx dude. trim() là giải pháp :)) – alicanbatur

+3

Điều đó loại bỏ phần đệm thừa, nhưng nó cũng loại bỏ tất cả các loại định dạng (ví dụ như in đậm, in nghiêng ..) có thể có trong khoảng .. Vì vậy, tại sao lại bận tâm với html ?? – Jakob

5

Có những gì bạn nghĩ là thực sự chính xác. Nó thêm không gian vào phía dưới. Nhưng trước đó hãy để tôi giải thích cách hoạt động của nó.

Bạn phải xem xét lớp HTML để xem cách hoạt động của lớp học.

Để đơn giản, đây là cách hoạt động: bất cứ khi nào lớp Html của bạn xem xét một thẻ <p>, những gì nó chỉ đơn giản là thêm hai ký tự "\ n" vào cuối.

Trong trường hợp này, không gian trống bạn nhìn thấy ở dưới cùng thực sự là do hai \ n được nối vào cuối của paragaraph.

Và tôi đã thêm các phương pháp thực tế của lớp Html có trách nhiệm cho hành động này,

private static void handleP(SpannableStringBuilder text) { 
    int len = text.length(); 

    if (len >= 1 && text.charAt(len - 1) == '\n') { 
     if (len >= 2 && text.charAt(len - 2) == '\n') { 
      return; 
     } 
     text.append("\n"); 
     return; 
    } 

    if (len != 0) { 

     text.append("\n\n"); 

    } 
} 

Nếu bạn muốn ghi đè lên hành động này, bạn phải ghi đè lên lớp Html bản thân mà là một chút khôn lanh và không thể hoàn thành ở đây.

EDIT

đây là liên kết với lớp Html,

Html class

+0

Cảm ơn bạn đã cho tôi biết về '/ n' đã được thêm vào. Tuy nhiên tôi tìm thấy giải pháp của riêng tôi, sẽ viết câu trả lời dưới đây. –

2

Nếu bạn đang cố gắng sử dụng nó trong một đối tượng hoặc cố gắng để phù hợp với nó ở một nơi cụ thể, hãy thử sử dụng <a> thẻ thay vì một <p>, <p> thêm lợi nhuận toa xe cuối cùng, một viết không có, nhưng bạn phải nhớ để tự viết \n mình với <b> và bạn giữ phong cách

0

Giải thích bởi @Andro Selva là chính xác và không có nhiều việc phải làm. Frustratingly, mọi thứ trở nên tốt hơn cho API 24 và sau đó với sự bao gồm của cờ trong cuộc gọi

Spanned fromHtml (String source, 
       int flags, 
       Html.ImageGetter imageGetter, 
       Html.TagHandler tagHandler); 

và tôi nghi ngờ FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH cờ sẽ làm giảm "\ n \ n" đôi của việc chấm dứt đoạn chuẩn đó của "\ n" đơn lẻ của ngắt dòng

Với lịch sử các phiên bản Android hiện có ~ Tôi không đủ khả năng viết phần mềm cho Android API 24+ độc quyền! Vì vậy, ... Tôi tìm thấy một giải pháp kludge với sự bao gồm của 2 thẻ tùy chỉnh thêm.

1. <scale factor="x.xx">... </scale> 
2. <default>... </default> 

cả gọi lớp RelativeSizeSpan thông qua phương pháp này

private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) { 
       int len = output.length(); 
       if (opening) { 
        System.out.println("scalefactor open: " + scalefactor); 
        output.setSpan(new RelativeSizeSpan(scalefactor), len, len, 
          Spannable.SPAN_MARK_MARK); 
       } else { 
        Object obj = getLast(output, RelativeSizeSpan.class); 
        int where = output.getSpanStart(obj); 
        scalefactor = ((RelativeSizeSpan)obj).getSizeChange(); 
        output.removeSpan(obj); 
        System.out.println("scalefactor close: " + scalefactor); 
        if (where != len) { 
         output.setSpan(new RelativeSizeSpan(scalefactor), where, len, 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        } 
       } 
      } 

được gọi là từ TagHandler tùy chỉnh cung cấp cho Html.fromHtml phương pháp, tức là:

private static class CustomTagHandler implements Html.TagHandler { 

    private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) { 
      int len = output.length(); 
      if (opening) { 
       //mSizeStack.push(scalefactor); 
       System.out.println("scalefactor open: " + scalefactor); 
       output.setSpan(new RelativeSizeSpan(scalefactor), len, len, 
         Spannable.SPAN_MARK_MARK); 
      } else { 
       Object obj = getLast(output, RelativeSizeSpan.class); 
       int where = output.getSpanStart(obj); 
       scalefactor = ((RelativeSizeSpan)obj).getSizeChange(); 

       output.removeSpan(obj); 

       //scalefactor = (float)mSizeStack.pop(); 
       System.out.println("scalefactor close: " + scalefactor); 
       if (where != len) { 
        output.setSpan(new RelativeSizeSpan(scalefactor), where, len, 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
      } 
     } 
... 
     final HashMap<String, String> mAttributes = new HashMap<>(); 

     @Override 
     public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { 
      String Attr; 
      processAttributes(xmlReader); 
      if ("default".equalsIgnoreCase(tag)) { 
       ProcessRelativeSizeTag(mDefaultTextSize, opening, output); 
       return; 
      } 

      if ("scale".equalsIgnoreCase(tag)) { 
       Attr = mAttributes.get("factor"); 
       if (Attr != null && !Attr.isEmpty()) { 
        float factor = parseFloat(Attr); 
        if (factor > 0) 
         ProcessRelativeSizeTag(factor, opening, output); 
       } 
       return; 
... 
      } 

     } 

Để sử dụng, tôi đặt kích thước văn bản của đối tượng Textview đến 1. Tức là, 1 pixel! Sau đó tôi đặt kích thước văn bản đúng theo yêu cầu trong biến mDefaultTextSize. Tôi có tất cả các chức năng Html bên trong một htmlTextView kéo dài TextView như:

public class htmlTextView extends AppCompatTextView { 
    static Typeface mLogo; 
    static Typeface mGAMZ; 
    static Typeface mBrush; 
    static Typeface mStandard; 
    int GS_PAINTFLAGS = FILTER_BITMAP_FLAG | ANTI_ALIAS_FLAG | SUBPIXEL_TEXT_FLAG | HINTING_ON; 
    static float mDefaultTextSize; 
    static Typeface mDefaultTypeface; 
etc 

}

trong đó bao gồm các phương pháp công

public void setDefaultTextMetrics(String face, float defaultTextSize) { 
     mDefaultTypeface = mStandard; 
     if (face != null) { 
      if ("gamz".equalsIgnoreCase(face)) { 
       mDefaultTypeface = mGAMZ; 
      } else { 
       if ("brush".equalsIgnoreCase(face)) { 
        mDefaultTypeface = mBrush; 
       } 
      } 
     } 
     setTypeface(mDefaultTypeface); 
     setTextSize(1); 
     mDefaultTextSize = defaultTextSize; 
    } 

Một ((htmlTextView)tv).setDefaultTextMetrics(null, 30); gọi đơn giản đặt htmlTextView tôi để sử dụng kiểu chữ tiêu chuẩn của tôi mặc định với kích thước văn bản là 30.

Sau đó, khi tôi g ive it ví dụ này để sử dụng trong fromHtml:

<string name="htmlqwert"> 
<![CDATA[ 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
]]> 
</string> 

thẻ tùy chỉnh của tôi <box> chỉ cho phép tôi làm nổi bật nền của văn bản. Xem hình ảnh đính kèm, cho thấy một kết quả bằng cách sử dụng thẻ <default> với kích thước TextView văn bản thiết lập để 1 và <default> thẻ gọi một RelevantSizeSpan bởi một yếu tố của 30, và một với:

<string name="htmlqwert"> 
    <![CDATA[ 
      <p><scale factor="1.5"><box> qwertQWERT </box></scale></p> 
      <p><scale factor="1.5"><box>qwertQWERT</box></scale></p> 
      <p><scale factor="1.5"><box>qwertQWERT</box></scale></p> 
      <p><scale factor="1.5"><box>qwertQWERT</box></scale></p> 
    ]]> 
    </string> 

sử dụng không <default> thẻ nhưng thiết thay vào đó, kích thước văn bản TextView là 30. Trong trường hợp đầu tiên, dòng mới bổ sung vẫn ở đó nhưng nó chỉ cao 1 pixel!

NB Không có điểm thực nào cho các thẻ <scale factor="1.5">...</scale>. Chúng chỉ còn sót lại trên các đồ tạo tác từ các thử nghiệm khác.

Kết quả: Cả hai ví dụ bên dưới đều có 2 dòng mới giữa các đoạn văn, nhưng ở phía bên trái, một trong những dòng này chỉ cao 1 pixel. Tôi sẽ để nó cho người đọc để tìm ra cách để giảm nó thành 0, nhưng không sử dụng kích thước văn bản của 0

Các vấn đề liên quan