如何在我的TextView中添加项目符号列表?
由于不支持ul/li/ol,所以很难实现。 但是,您可以使用以下语法糖来解决:
• foo<br/>
• bar<br/>
• baz<br/>
•
是表示列表标记的 HTML 实体。
更多选项可以在这里找到:http://www.elizabethcastro.com/html/extras/entities.html
有关支持哪些标签的更多信息由 Mark Murphy(@CommonsWare)提供:http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html 使用 Html.fromHtml 加载它。
((TextView)findViewById(R.id.my_text_view)).setText(Html.fromHtml(myHtmlString));
<string name="string_name"><![CDATA[ • foo<br /> • bar... ]]></string>
- Quentin S.ul
/li
标签了。 - hmacbrowep 以 HTML 方式很好地解释了这个问题。 提供的使用 HTML 实体的解决方案可能会有所帮助。但它仅包括项目符号。如果您的文本换行,缩进将不正确。
我发现其他解决方案嵌入了 Web 视图。这可能对某些人来说是适当的,但我认为这有点过于复杂...(使用列表视图也是如此。)
我喜欢 Nelson 的创意方法 :D,但它不允许您向文本视图添加无序列表。
下面是我的一个无序列表示例,使用 BulletSpan。
CharSequence t1 = getText(R.string.xxx1);
SpannableString s1 = new SpannableString(t1);
s1.setSpan(new BulletSpan(15), 0, t1.length(), 0);
CharSequence t2 = getText(R.string.xxx2);
SpannableString s2 = new SpannableString(t2);
s2.setSpan(new BulletSpan(15), 0, t2.length(), 0);
textView.setText(TextUtils.concat(s1, s2));
Positive:
Negative:
我发现了一种替代方法...只需复制这个符号 "•" (它是文本),并将其粘贴到您的文本视图中,您可以通过更改textcolor以及所有其他属性(如大小、高度和宽度)来更改此符号的颜色。 :)
您可以在输入时使用快捷方式来获取此符号。
对于Windows
ALT + 7
对于Mac
ALT + 8
可立即使用的 Kotlin 扩展
fun List<String>.toBulletedList(): CharSequence {
return SpannableString(this.joinToString("\n")).apply {
this@toBulletedList.foldIndexed(0) { index, acc, span ->
val end = acc + span.length + if (index != this@toBulletedList.size - 1) 1 else 0
this.setSpan(BulletSpan(16), acc, end, 0)
end
}
}
}
用法:
val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList
颜色和大小:
要更改项目符号的颜色或大小,请使用CustomBulletSpan而不是BulletSpan。
package com.fbs.archBase.ui.spans
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.text.Layout
import android.text.Spanned
import android.text.style.LeadingMarginSpan
import androidx.annotation.ColorInt
class CustomBulletSpan(
private val bulletRadius: Int = STANDARD_BULLET_RADIUS,
private val gapWidth: Int = STANDARD_GAP_WIDTH,
@ColorInt private val circleColor: Int = STANDARD_COLOR
) : LeadingMarginSpan {
private companion object {
val STANDARD_BULLET_RADIUS = Screen.dp(2)
val STANDARD_GAP_WIDTH = Screen.dp(8)
const val STANDARD_COLOR = Color.BLACK
}
private val circlePaint = Paint().apply {
color = circleColor
style = Paint.Style.FILL
isAntiAlias = true
}
override fun getLeadingMargin(first: Boolean): Int {
return 2 * bulletRadius + gapWidth
}
override fun drawLeadingMargin(
canvas: Canvas, paint: Paint, x: Int, dir: Int,
top: Int, baseline: Int, bottom: Int,
text: CharSequence, start: Int, end: Int,
first: Boolean,
layout: Layout?
) {
if ((text as Spanned).getSpanStart(this) == start) {
val yPosition = (top + bottom) / 2f
val xPosition = (x + dir * bulletRadius).toFloat()
canvas.drawCircle(xPosition, yPosition, bulletRadius.toFloat(), circlePaint)
}
}
}
受这里各种答案的启发,我创建了一个实用程序类,使此过程变得简单易行。这将创建一个带有文本缩进的项目列表。它具有合并字符串、字符串资源和字符串数组资源的方法。
它将创建一个CharSequence,您可以将其传递给TextView。例如:
CharSequence bulletedList = BulletListUtil.makeBulletList("First line", "Second line", "Really long third line that will wrap and indent properly.");
textView.setText(bulletedList);
希望有所帮助。享受吧。
注意:这将使用系统标准的圆点,颜色与文本相同。如果您想要自定义符号,请考虑继承BulletSpan并重写其drawLeadingMargin()
方法以绘制所需符号。查看BulletSpan源代码了解其工作原理。
public class BulletTextUtil {
/**
* Returns a CharSequence containing a bulleted and properly indented list.
*
* @param leadingMargin In pixels, the space between the left edge of the bullet and the left edge of the text.
* @param context
* @param stringArrayResId A resource id pointing to a string array. Each string will be a separate line/bullet-point.
* @return
*/
public static CharSequence makeBulletListFromStringArrayResource(int leadingMargin, Context context, int stringArrayResId) {
return makeBulletList(leadingMargin, context.getResources().getStringArray(stringArrayResId));
}
/**
* Returns a CharSequence containing a bulleted and properly indented list.
*
* @param leadingMargin In pixels, the space between the left edge of the bullet and the left edge of the text.
* @param context
* @param linesResIds An array of string resource ids. Each string will be a separate line/bullet-point.
* @return
*/
public static CharSequence makeBulletListFromStringResources(int leadingMargin, Context context, int... linesResIds) {
int len = linesResIds.length;
CharSequence[] cslines = new CharSequence[len];
for (int i = 0; i < len; i++) {
cslines[i] = context.getString(linesResIds[i]);
}
return makeBulletList(leadingMargin, cslines);
}
/**
* Returns a CharSequence containing a bulleted and properly indented list.
*
* @param leadingMargin In pixels, the space between the left edge of the bullet and the left edge of the text.
* @param lines An array of CharSequences. Each CharSequences will be a separate line/bullet-point.
* @return
*/
public static CharSequence makeBulletList(int leadingMargin, CharSequence... lines) {
SpannableStringBuilder sb = new SpannableStringBuilder();
for (int i = 0; i < lines.length; i++) {
CharSequence line = lines[i] + (i < lines.length-1 ? "\n" : "");
Spannable spannable = new SpannableString(line);
spannable.setSpan(new BulletSpan(leadingMargin), 0, spannable.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
sb.append(spannable);
}
return sb;
}
}
这绝对是最简单的...
<string name="bullet_ed_list">\n\u2022 He has been Chairman of CFL Manufacturers Committee of ELCOMA, the All India Association of Lighting Equipment Manufacturers.
\n\u2022 He has been the President of Federation of Industries of India (FII).</string>
注意到我的八年老回答,决定基于最新的Android文档中有关使用HTML标记样式化文本进行更新:
<ul>
和<li>
)。这些标签及其他许多标签都受支持!setText()
直接设置TextView文本。•
字符或其十六进制代码更好,如果你想保留多行字符串中的缩进。可以通过在字符串资源中使用<ul>
和<li>
标签来创建项目符号列表。
不要使用 setText(Html.fromHtml(string)) 在代码中设置字符串!只需在xml中正常设置字符串或使用setText(string)。
E.g:
strings.xml 文件
<string name="str1">
<ul>
<li><i>first</i> item</li>
<li>item 2</li>
</ul>
</string>
<ul>
- Blundell\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
- Jack T使用带有复合可绘制对象的简单TextView。例如:
<TextView
android:text="Sample text"
android:drawableLeft="@drawable/bulletimage" >
</TextView>
<style name="Text.Bullet">
<item name="android:background">@drawable/bullet</item>
<item name="android:paddingLeft">10dp</item>
</style>
使用方法:
<TextView android:id="@+id/tx_hdr"
android:text="Item 1" style="@style/Text.Bullet" />
android:drawableLeft=
。 - Blundellevery list item is store as a separate string resource
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="0.2"
android:text="1." />
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="3"
android:text="@string/help_points1" />
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="0.2"
android:text="2." />
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="3"
android:text="@string/help_points2" />
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="0.2"
android:text="3." />
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="3"
android:text="@string/help_points3" />
</TableRow>
</TableLayout>
同时还需要考虑样式:
<style name="helpPagePointsStyle">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">left</item>
</style>