2013-02-14 26 views
6

Tôi có một số nhiều TextView có thể hiển thị một số URL tùy chọn. Bây giờ tôi có một vấn đề: một số URL dài của tôi hiển thị đã được bọc trong vị trí của ://Làm cách nào để ngăn các URL bị gói trong TextView?

sometext sometext http:// <-- AUTO LINE WRAP 
google.com/ 

Làm thế nào tôi có thể vô hiệu hóa gói cho toàn bộ URL hoặc ít nhất là cho http(s):// tiền tố? Tôi vẫn cần gói văn bản để được kích hoạt tuy nhiên.

văn bản của tôi nên quấn như thế

sometext sometext <-- AUTO LINE WRAP 
http://google.com/ 
+0

cho chúng ta thấy mã của bạn liên quan đến xem văn bản. –

+0

@SourabSharma chỉ đơn giản là 'StringBuilder' tạo chuỗi có nhiều phần tử tùy chọn, được phân tách bằng dấu cách và dấu phẩy. Một trong các chuỗi có thể là URL. – Andrew

Trả lời

0

Đây chỉ là bằng chứng của khái niệm để thực hiện tùy chỉnh quấn cho TextView. Bạn có thể cần phải thêm/chỉnh sửa các điều kiện theo yêu cầu của bạn.

Nếu yêu cầu của bạn là lớp văn bản của chúng tôi phải hiển thị nhiều dòng theo cách không được kết thúc bằng văn bản nhất định (tại đây http: // và http :), Tôi đã sửa đổi mã của lớp văn bản rất phổ biến trên sO để đáp ứng yêu cầu này: Nguồn: Auto Scale TextView Text to Fit within Bounds

Thay đổi:

private boolean mCustomLineWrap = true; 

/** 
    * Resize the text size with specified width and height 
    * @param width 
    * @param height 
    */ 
    public void resizeText(int width, int height) { 
     CharSequence text = getText(); 
     // Do not resize if the view does not have dimensions or there is no text 
     if(text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) { 
      return; 
     } 

     // Get the text view's paint object 
     TextPaint textPaint = getPaint(); 

     // Store the current text size 
     float oldTextSize = textPaint.getTextSize(); 
     // If there is a max text size set, use the lesser of that and the default text size 
     float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize; 

     // Get the required text height 
     int textHeight = getTextHeight(text, textPaint, width, targetTextSize); 

     // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes 
     while(textHeight > height && targetTextSize > mMinTextSize) { 
      targetTextSize = Math.max(targetTextSize - 2, mMinTextSize); 
      textHeight = getTextHeight(text, textPaint, width, targetTextSize); 
     } 



     if(mCustomLineWrap) { 

      // Draw using a static layout 
      StaticLayout layout = new StaticLayout(text, textPaint, width, Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false); 
      // Check that we have a least one line of rendered text 
      if(layout.getLineCount() > 0) { 
       String lineText[] = new String[layout.getLineCount()]; 
       // Since the line at the specific vertical position would be cut off, 
       // we must trim up to the previous line 
       String wrapStr = "http:", wrapStrWithSlash = "http://"; 
       boolean preAppendWrapStr = false, preAppendWrapStrWithSlash = false ; 
       for(int lastLine = 0; lastLine < layout.getLineCount(); lastLine++) 
       { 
        int start = layout.getLineStart(lastLine); 
        int end = layout.getLineEnd(lastLine); 
        lineText[lastLine] = ((String) getText()).substring(start,end); 
        if(preAppendWrapStr) 
        { 
         lineText[lastLine] = "\n" + wrapStr + lineText[lastLine]; 
         preAppendWrapStr = false; 
        } 
        else if(preAppendWrapStrWithSlash) 
        { 
         lineText[lastLine] = "\n" + wrapStrWithSlash + lineText[lastLine]; 
         preAppendWrapStrWithSlash = false; 
        } 

        if(lineText[lastLine].endsWith(wrapStr)) 
        { 
         preAppendWrapStr = true; 
         lineText[lastLine] = lineText[lastLine].substring(0,lineText[lastLine].lastIndexOf(wrapStr)); 
        } 
        if(lineText[lastLine].endsWith(wrapStrWithSlash)) 
        { 
         preAppendWrapStrWithSlash = true; 
         lineText[lastLine] = lineText[lastLine].substring(0,lineText[lastLine].lastIndexOf(wrapStrWithSlash)); 
        } 

       } 
       String compString = ""; 
       for(String lineStr : lineText) 
       { 
        compString += lineStr; 
       } 
        setText(compString); 
      } 

     } 

     // Some devices try to auto adjust line spacing, so force default line spacing 
     // and invalidate the layout as a side effect 
     textPaint.setTextSize(targetTextSize); 
     setLineSpacing(mSpacingAdd, mSpacingMult); 

     // Notify the listener if registered 
     if(mTextResizeListener != null) { 
      mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize); 
     } 

     // Reset force resize flag 
     mNeedsResize = false; 
    } 
+0

Cảm ơn, các giải pháp của bạn hoạt động nhưng bạn có ý tưởng gì về cách giữ nhịp văn bản nếu có? Bây giờ tất cả các kiểu văn bản bên trong textView đều bị xóa vì 'setText()' – Andrew