Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在文本视图中选择粗体文本_Java_Android_Text - Fatal编程技术网

Java 如何在文本视图中选择粗体文本

Java 如何在文本视图中选择粗体文本,java,android,text,Java,Android,Text,我有以下声明: s = s + "Id: " + lc.getID() + " Name: " + lc.getName() + "\n" + " Phone Number: " + lc.getPhone() + " Email: " + lc.getEmail() + "\n" + " Description: " + lc.getDescription() + "\n\n" 打印出来的是: Id: 1 Name

我有以下声明:

s = s +   "Id: " + lc.getID() + "  Name: " + lc.getName() + "\n"
                + "  Phone Number: " + lc.getPhone() + "  Email: " + lc.getEmail() + "\n"
                + "  Description: " + lc.getDescription() + "\n\n"
打印出来的是:

Id: 1  Name: Eric
 Phone Number: 8294038  Email: foo@gmail.com
 Description: Cool guy Eric
我只想加粗标题(Id、姓名等)

我试过这个:

        s = s + Html.fromHtml(" <b> Id: </b>" + lc.getID() + "  <b> Name: </b>" + lc.getName() + "\n"
                + "  Phone Number: " + lc.getPhone() + "  Email: " + lc.getEmail() + "\n"
                + "  Description: " + lc.getDescription() + "\n"
                + "\n\n");
s=s+Html.fromHtml(“Id:+lc.getID()+”名称:“+lc.getName()+”\n”
+电话号码:“+lc.getPhone()+”电子邮件:“+lc.getEmail()+”\n
+描述:“+lc.getDescription()+”\n”
+“\n\n”);

但它不仅没有加粗,而且去掉了新行(\n)。有什么办法可以做到这一点吗?谢谢。

这将需要对您的终端进行一点解析,但您肯定希望深入研究

例如,假设我有以下字符串:

String s = "How now brown cow";
然后,我会将其转换为
SpannableString
,只需将字符串输入构造函数,如下所示:

SpannableString ss = new SpannableString(s);
从那里你需要你的风格与跨越面积。为此,我将只使用
SubscriptSpan
,但如果您希望创建自己的类,只需创建自己的类扩展并重写
updateDrawState(TextPaint ds)
方法即可。以下是如何设置跨度:

/ *
  * the first argument is the span effect you want, the second and third
  * are the start and end indices, respectively, and the last argument is
  * for setting a flag, which you probably won't need.
  */
ss.setSpan(new SubscriptSpan(), 0, 2, 0);
现在,您可以直接将字符串放入
TextView
,它应该按照您的意愿显示,如下所示:

myTextView.setText(ss);
Html.fromHtml()

跨越的
不是
字符串

通过执行
s=s+Html.fromHtml(…)
,您是在说“请将此Html解析为一个
跨距的
,然后扔掉所有格式,给我一个
字符串
,我可以连接到其他
字符串
”。这不是你想要的--你想要保留格式。但是Java
字符串
没有格式,因此普通的字符串连接无法保持格式

除此之外,正如Manishika指出的,在HTML中新行被忽略,因为您使用HTML元素来表示垂直空白

你的选择包括:

  • 生成一个completeHTML代码段——包括您试图将其连接到的内容——然后在整个过程中使用
    HTML.fromHtml()
    。您可能希望为此使用模板引擎(例如),或
    String.format()
    。或者,使用
    StringBuilder
    ,而不是大量的
    +
    操作(更少的内存波动,更快的性能)。请确保使用

    作为换行符/段落分隔符

  • 使用
    SpannableStringBuilder
    从组件组装字符串及其格式

  • 使用
    TextUtils.concat(s,Html.fromHtml(…)
    而不是
    s+Html.fromHtml(…)
    ,因为
    concat()
    将维护实现格式化的跨度。虽然
    fromHtml()
    返回的
    span
    的实现不是
    String
    ,但它和
    String
    都是
    CharSequence
    ,因此可以使用
    concat()


  • 尝试使用“
    ”而不是“\n”这对新行有效,但仍然不适用。请欣赏答案!不要欣赏这些侮辱。不过,谢谢你的帮助@尼克:对多个字符串连接使用
    +
    是一种Java反模式,在学习Java的任何地方都应该涉及到这一模式。顺便说一句,我在答案中添加了第三个选项(当我开始回答时,我记着了,然后忘记了…),你能解释一下如何连接这些字符串吗?或者至少给我一个开始。请原谅我没有knowledge@nick:使用
    StringBuilder
    ,如回答中所述。非常感谢。我去看看