【问题标题】:Two different styles in single textview android单个textview android中的两种不同样式
【发布时间】:2021-12-29 08:12:47
【问题描述】:

我正在尝试合并两个具有两种不同样式的文本视图。

在上面的图片中,如何将弯曲的边框文本视图放在上面的文本末尾。表示在 (6) 的末尾。有一种方法可以在 html 中执行此操作,但在 html 中不显示边框。

String html = "<p style=\"border:1px; border-style:solid; border-color:#FF0000; padding: 1em;\"> B1-993m </p>";
            holder.book2.setText(Html.fromHtml(
                    html,
                            Html.FROM_HTML_MODE_LEGACY));

如果我们将上面的代码放在 html 文件中但在 android 中不起作用,则上面的代码可以工作。在 android 中似乎不支持某些 html 样式。有什么办法可以做到这一点,或者我的 html 与 android 有什么问题。

弹性布局:

【问题讨论】:

  • 会很快,因为它进入了recyclerview
  • 有两个文本视图。一个是正​​常的,另一个是弯曲的边框背景。如何将第二个 textview 放在第一个 textview 字符的末尾。
  • 我想像第二张图片一样,但边框像第一张图片
  • FlexBoxlayout 没有帮助。上传的截图你能看吗
  • 这样的事情通常是用跨度来完成的。事实上,Html.fromHtml() 所做的只是寻找某些标签并将它们替换为适当的跨度类型;例如,ForegroundColorSpanStyleSpan 等。不幸的是,SDK 中没有“BorderSpan”,但我敢打赌,有人在某个时候做了一个。您可能会四处寻找一个(不一定是那个特定的名称),但即使您找不到现有的实现,如果必须的话,您自己也不会太难。

标签: android html xml


【解决方案1】:

不确定 HTML 部分我对 HTML 不太了解。 我从你的问题中了解到我认为这可以通过SpannableString 来完成。您所要做的就是创建一个自定义ReplacementSpan。要应用跨度,您需要了解跨度索引,即您想要显示框的确切位置。 我试过以下方式。它只是一个示例类,您可以根据需要修改绘图的颜色和样式。

public class BoxedSpan extends ReplacementSpan {
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
    RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom);
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    canvas.drawRoundRect(rect, 10f, 10f, paint);
    paint.setStyle(Paint.Style.FILL);
    canvas.drawText(text, start, end, x, y, paint);
}
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
    return Math.round(measureText(paint, text, start, end));
}
private float measureText(Paint paint, CharSequence text, int start, int end) {
    return paint.measureText(text, start, end);
}
}

这是我尝试过的示例代码:-

SpannableStringBuilder stringBuilder = new
            SpannableStringBuilder("Here is some text B1-38 B2-36");
    stringBuilder.setSpan(new BoxedSpan(), 18, 23, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    stringBuilder.setSpan(new BoxedSpan(), 24, stringBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(stringBuilder);

看起来它几乎可以完成这项工作。试一试。

【讨论】:

  • 是的。它正在工作。谢谢 ADM。
【解决方案2】:

首先,您可以尝试使用ConstraintLayout,它将帮助您正确排列所有视图元素,而这两个圆角TextView可以通过添加圆角背景来完成。您不需要任何 html 标记。

【讨论】:

    【解决方案3】:

    您可能更适合为 B1-38

    使用带有圆边的背景可绘制对象

    【讨论】:

    • 是的,但我想从上面 textview 的末尾开始(在 (6) 的末尾)。
    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多