【问题标题】:How to prevent URLs from being wrapped in TextView?如何防止 URL 被包裹在 TextView 中?
【发布时间】:2013-02-14 09:27:50
【问题描述】:

我有一个多行TextView,它可以显示一些可选的 URL。现在我有一个问题:我的一些长网址显示在://的位置

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

如何禁用整个 URL 或至少 http(s):// 前缀的换行?但是,我仍然需要启用文本换行。

我的文字应该这样换行

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

【问题讨论】:

  • 向我们展示您与文本视图相关的代码。
  • @SourabSharma 只是一个简单的StringBuilder 创建一个带有多个可选子字符串的字符串,用空格和逗号分隔。其中一个字符串可以是 URL。

标签: android textview word-wrap


【解决方案1】:

这只是为 textview 实现自定义换行的概念证明。 您可能需要根据需要添加/编辑条件。

如果您的要求是我们的 textview 类必须以这样的方式显示多行,它不应该以某些文本结尾(这里是 http:// 和 http:), 我已经通过 SO 修改了非常流行的 textview 类的代码以满足这个要求: 来源 : Auto Scale TextView Text to Fit within Bounds

变化:

 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;
    }

【讨论】:

  • 谢谢,您的解决方案有效,但您知道如何保持文本跨度(如果有的话)吗?现在由于setText(),textView 里面的所有文本样式都被清除了
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多