我有这样的声明:
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,Name等)。
我试过了:
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");
但它不仅没有大胆,而且还带走了新的行(\ n)。有关如何完成这项工作的任何想法?感谢。
答案 0 :(得分:0)
在你的结尾需要一点点解析,但你肯定想看看SpannableStrings
。
例如,假设我有以下字符串:
String s = "How now brown cow";
然后我将它转换为SpannableString
,只需将字符串输入构造函数,如下所示:
SpannableString ss = new SpannableString(s);
从那里你需要你的跨度区域的风格。为此,我将使用SubscriptSpan
,但如果您想自己创建,则只需将自己的类扩展为CharacterStyle
并覆盖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);
答案 1 :(得分:0)
Html.fromHtml()
会返回一个Spanned
对象,旨在将直接放入TextView
或类似的小部件中。
Spanned
不是String
。
通过执行s = s + Html.fromHtml(...)
,您说“请将此HTML解析为Spanned
,然后抛弃所有格式以给我String
我可以连接到其他{ {1}}”。这不是你想要的 - 你想保持格式化。但是Java String
没有格式化,因此普通的字符串连接无法保留它。
除此之外,正如Manishika指出的那样,无论如何,HTML都会忽略换行符,因为你将HTML元素用于垂直空格。
您的选择包括:
生成完整 HTML代码段 - 包括您尝试将其连接到的所有内容 - 然后在整个内容中使用String
。您可能希望使用模板引擎(例如jmustache)或Html.fromHtml()
。或者,使用String.format()
,而不是大量的StringBuilder
操作(更少的内存流失,更快的性能)。请务必使用+
或<br/>
作为换行符/段落分隔符。
使用<p>
从组件中组装字符串及其格式。
使用SpannableStringBuilder
代替TextUtils.concat(s, Html.fromHtml(...))
,因为s + Html.fromHtml(...)
将维护实现格式化的范围。虽然concat()
返回的Spanned
的实施不是fromHtml()
,但它和String
都是String
,因此可以使用CharSequence