2013-02-14 1 views
6

Ich habe eine Multilinie TextView, die einige optionale URL anzeigen kann. Jetzt habe ich ein Problem: einige meiner langen URLs angezeigt in der Position eingewickelt von ://Wie verhindert man, dass URLs in TextView eingebunden werden?

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

Wie kann ich für die gesamte URL zu deaktivieren Einwickeln oder zumindest für http(s):// Präfix? Ich brauche dennoch Textumbruch, um aktiviert zu werden.

Mein Text wie die

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

zeigen uns Ihren Code Textansicht verwendet. –

+0

@SourabSharma nur ein einfacher 'StringBuilder', der einen String mit mehreren optionalen Teilstrings erzeugt, getrennt durch Leerzeichen und Kommas. Eine der Zeichenfolgen kann die URL sein. – Andrew

Antwort

0

wickeln sollten Dies ist nur Proof of Concept für benutzerdefinierte Textview wickeln zu implementieren. Möglicherweise müssen Sie Bedingungen entsprechend Ihrer Anforderung hinzufügen/bearbeiten.

Wenn Ihre Anforderung ist, dass unsere Klasse mehrzeiligen Textview in einer solchen Art und Weise zeigen müssen, dass sie nicht mit bestimmten Text jemals (hier http enden sollte: // und http :), ich den Code der sehr beliebten Textview-Klasse geändert haben über SO diese Anforderung zu erfüllen: Quelle: Auto Scale TextView Text to Fit within Bounds

Änderungen:

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

Vielen Dank, Ihre Lösungen funktionieren, aber haben Sie eine Idee, wie Sie Textspannen halten, wenn überhaupt? Nun werden alle Textstile innerhalb von textView wegen 'setText()' gelöscht – Andrew