首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓系统中<hr>标签的使用

安卓系统中<hr>标签的使用
EN

Stack Overflow用户
提问于 2013-10-18 08:24:21
回答 6查看 6.5K关注 0票数 8

我有一个声明,我必须加一条水平线。但它不受android的支持,似乎有任何方法可以重新创建

使用支持的标记在android中的标记效果。

代码语言:javascript
复制
String message = "Hello <br> hai<br> I am fine <hr>";
tab.setText(Html.fromHtml(message));

它显示了你好

hai

我很好

但没有水平线。

这里,"hr“的HTML标记不起作用。是否有任何方法从受支持的标记中添加hr标记效果。提前谢谢..。

EN

回答 6

Stack Overflow用户

发布于 2017-05-03 03:51:46

Html.fromHtml()目前不支持<hr>标记,因此您需要编写实现Html.TagHandler的自己的标记处理程序。安卓系统中的TextViews是使用Spans设计的,所以我们需要创建一个Span,它也可以画一条水平线,让我们称之为HrSpan

Java

代码语言:javascript
复制
String html = "Hello <br> hai<br> I am fine <hr> And here's another line";

HtmlTagHandler tagHandler = new HtmlTagHandler();
Spanned styledText = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY, null, tagHandler);
textView.setText(styledText);

HtmlTagHandler.java

代码语言:javascript
复制
public class HtmlTagHandler implements Html.TagHandler {

    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
        if (tag.equals("hr")) {
            handleHrTag(opening, output);
        }
    }

    private void handleHrTag(boolean opening, Editable output) {
        final String placeholder = "\n-\n";
        if (opening) {
            output.insert(output.length(), placeholder);
        } else {
            output.setSpan(new HrSpan2(), output.length() - placeholder.length(), output.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
}

HrSpan.java

代码语言:javascript
复制
public class HrSpan extends ReplacementSpan {

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
        return 0;
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(8); // 8px tall line

        int middle = (top + bottom) / 2;
        // Draw a line across the middle of the canvas
        canvas.drawLine(0, middle, canvas.getWidth(), middle, paint);
    }
}

Kotlin

代码语言:javascript
复制
val html = "Hello <br> hai<br> I am fine <hr> Another line here <hr><hr>"
val tagHandler = HtmlTagHandler()

textView.text = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY, null, tagHandler)

代码语言:javascript
复制
class HtmlTagHandler : Html.TagHandler {

    override fun handleTag(opening: Boolean, tag: String?, output: Editable?, xmlReader: XMLReader?) {
        if (output == null) return

        when (tag) {
            "hr" -> handleHrTag(opening, output)
            // Handle other tags if needed
        }
    }

    private fun handleHrTag(opening: Boolean, output: Editable) {
        val placeholder = "\n-\n" // Makes sure the HR is drawn on a new line
        if (opening) {
            output.insert(output.length, placeholder)
        } else {
            output.setSpan(HrSpan(), output.length - placeholder.length, output.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        }
    }
}

代码语言:javascript
复制
class HrSpan : ReplacementSpan() {

    override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?) = 0

    override fun draw(
        canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int,
        bottom: Int, paint: Paint
    ) {
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = 8f

        // Draw line in the middle of the available space
        val middle = ((top + bottom) / 2).toFloat()

        canvas.drawLine(0f, middle, canvas.width.toFloat(), middle, paint)
    }
}

这应该会给你这样的结果。它与您的TextView的宽度相匹配,因此,如果您希望该行占用全部宽度,则将TextView宽度属性更改为match_parent。

票数 18
EN

Stack Overflow用户

发布于 2013-10-18 08:42:36

Android Html.fromHTML并不支持所有标签。

如果你想要这样的标签,我建议你用WebView代替

代码语言:javascript
复制
WebView webview = new WebView(this);

String summary = "<html><body>Sorry, <span style=\"background: red;\">Madonna</span> gave no results</body></html>";

webview.loadData(summary, "text/html", "utf-8");

WebView将允许您拥有HR或任何您喜欢的标记。

票数 1
EN

Stack Overflow用户

发布于 2013-10-18 08:37:28

Android中不支持hr标记。您必须为水平线添加一个单独的视图,以背景色作为文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19444911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档