如何将项目符号列表添加到android应用程序?


89

我已经用谷歌搜索了问题,但没有提供有效的答案。如何将项目符号列表添加到我的textview中。

Answers:


185

不支持执行ul / li / ol。幸运的是,您可以将其用作语法糖:

&#8226; foo<br/>
&#8226; bar<br/>
&#8226; baz<br/>

&#8226;是列表项目符号的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));

1
感谢您链接到commonsware网站,一段时间以来一直在寻找类似的东西!
Norman H

4
请注意,如果要从values / strings.xml(使用context.getString(R.string.yourstring);)中获取字符串,则必须将其包装在CDATA中<string name="string_name"><![CDATA[ &#8226; foo<br /> &#8226; bar... ]]></string>
Quentin S.

5
如果项目符号点项目中
有多

它看起来像ul/ li现在受支持stackoverflow.com/questions/9754076/…–
hmac

55
  1. browep很好地解释了HTML。所提供的带有html实体的解决方案可能会很有用。但这仅包括子弹。如果您的文字换行,则缩进将不正确。

  2. 我发现了嵌入Web视图的其他解决方案。也许这对某些人来说是适当的,但是我认为这有点矫kill过正(与使用列表视图相同)。

  3. 我喜欢Nelson:D 的创新方法,但是它不能为您在文本视图中添加无序列表。

  4. 我的示例使用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));

正:

  • 自动换行后缩进的项目符号。
  • 您可以在一个TextView实例中合并其他格式化或未格式化的文本
  • 您可以在BulletSpan构造函数中定义缩进量。

负:

  • 您必须将列表的每个项目保存在单独的字符串资源中。因此,您无法定义您的列表来使用HTML。

1
这种方法(完全模仿)在2.2上不起作用。您最终只能获得一颗子弹。
Skone 2011年

嗨Skone,它可以在2.2模拟器和原始android版本中使用。我看到了一个android版本,其中项目符号和文本之间的空格被忽略了。但是子弹仍然出现。项目符号字符串的末尾是否有新行?
Diego Frehner 2011年

当您在textview中更改行间距时,此解决方案不起作用
Marqs 2012年

使用BulletSpan做到这一点的好方法,效果很好,非常简单!
Moonbloom '16

7
上面的代码对我有用!!!我要做的就是在xml中每个字符串的末尾添加“ \ n” ...
Arhat Baid

38

我找到了一个替代方法。只需复制此项目符号“•”(它是文本)并粘贴到文本视图的文本中,就可以通过更改textcolor以及所有其他属性(如大小,高度,宽度)来更改项目符号的颜色。 .. :)

您可以在输入时使用快捷方式获取此项目符号

用于窗户

ALT + 7

对于Mac

ALT + 8


2
Alt + 7对我不起作用(也许仅对Mac或Linux有用),但是复制和粘贴Unicode字符•起作用。
2015年

2
仅供参考:ALT + 7仅在键盘具有单独的数字键盘时才有效。
Aks4125 '16

如果将符号粘贴到代码(即字符串)中,请记住非ASCII字符和文件编码的问题(尝试从IntelliJ的右下角更改文件的编码)。更好的方法是使用相应的转义序列(例如\ u1234)。
Gil Vegliach '16

走的路!暴徒生活!
goonerDroid

2
\ u2022是答案
user2322082

21

受这里各种答案的启发,我创建了一个Utility类,使它很容易使用。这将创建一个项目符号列表,其中包含缩进的文本。它具有组合字符串,字符串资源和字符串数组资源的方法。

它将创建一个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;
}

}

谢谢亲爱的先生!我使用了makeBulletList函数,它的工作原理很像:D
Aba,

这很棒!谢谢)
kulikovman

10

到目前为止,这是最简单的。

<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>

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)
        }
    }
}

您能以某种方式更改项目符号的大小以匹配文本大小吗?
nenur

@NoahTanenholtz,您可以通过更改BulletSpan()参数值来增加子弹的大小
Mikhail Sharin

哦,我认为那是间隔
nenur

间距增加,而不是子弹大小):
Sumit Shukla

@SumitShukla感谢您的评论。我刚刚添加了BulletCustomSpan以进行颜色和尺寸自定义
Mikhail Sharin

4

我使用的一个选项是使用样式设置可绘制的项目符号。

<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" />

我只是从网上拿了一个小项目符号图片作为绘图文件。Eclipse中的图形布局显示了在文本下方延伸的图形...远非我想要的。
JohnK 2012年

1
我认为他的意思是android:drawableLeft=
Blundell


3

这是另一种解决方案,不是将列表完全添加到一个textview中,但是我想目标是相同的。它使用的是TableLayout,只需要XML,对于小的有序列表或无序列表来说,这非常简单。下面是我用于此的示例代码,而不是Java中的一行代码。

正:

  • 您可以将任何您喜欢的内容放在表格行中,而不必是textview
  • 您可以使用它来创建项目符号和编号列表或任何其他内容
  • 您可以使用padding或layout_weight定义缩进

负:

  • 冗长的列表很冗长(除非您在regex中使用一些狡猾的文本编辑器)
  • 每个列表项都存储为单独的字符串资源

        <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>

2

这是一个项目符号列表,在每个项目的前面都有标题和标签。

public class BulletListBuilder {

    private static final String SPACE = " ";
    private static final String BULLET_SYMBOL = "&#8226";
    private static final String EOL = System.getProperty("line.separator");
    private static final String TAB = "\t";

    private BulletListBuilder() {

    }

    public static String getBulletList(String header, String []items) {
        StringBuilder listBuilder = new StringBuilder();
        if (header != null && !header.isEmpty()) {
            listBuilder.append(header + EOL + EOL);
        }
        if (items != null && items.length != 0) {
            for (String item : items) {
                Spanned formattedItem = Html.fromHtml(BULLET_SYMBOL + SPACE + item);
                listBuilder.append(TAB + formattedItem + EOL);
            }
        }
        return listBuilder.toString();
    }

}

2

经过彻底的矫kill过正,并制作了自定义文本视图。

像这样使用它:

<com.blundell.BulletTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="--bullet 1 --bullet two --bullet three --bullet four" />

和代码:

package com.blundell;

import android.content.Context;
import android.text.Html;
import android.util.AttributeSet;
import android.widget.TextView;

public class BulletTextView extends TextView {
    private static final String SPLITTER_CHAR = "--";
    private static final String NEWLINE_CHAR = "<br/>";
    private static final String HTML_BULLETPOINT = "&#8226;";

    public BulletTextView(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.textViewStyle);
    }

    public BulletTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        checkForBulletPointSplitter();
    }

    private void checkForBulletPointSplitter() {
        String text = (String) getText();
        if (text.contains(SPLITTER_CHAR)) {
            injectBulletPoints(text);
        }
    }

    private void injectBulletPoints(String text) {
        String newLinedText = addNewLinesBetweenBullets(text);
        String htmlBulletText = addBulletPoints(newLinedText);
        setText(Html.fromHtml(htmlBulletText));
    }

    private String addNewLinesBetweenBullets(String text) {
        String newLinedText = text.replace(SPLITTER_CHAR, NEWLINE_CHAR + SPLITTER_CHAR);
        newLinedText = newLinedText.replaceFirst(NEWLINE_CHAR, "");
        return newLinedText;
    }

    private String addBulletPoints(String newLinedText) {
        return newLinedText.replace(SPLITTER_CHAR, HTML_BULLETPOINT);
    }

}

我们如何增加子弹的大小和间距?
Sumit Shukla

本示例使用的是&#8226;您必须选择另一个符号fsymbols.com/signs/bullet-point
Blundell

1

我发现这是最简单的方法,将textView保留在xml文件中,并使用以下Java代码。对我来说效果很好。

private static final String BULLET_SYMBOL = "&#8226";

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tutorial);

    TextView tv = (TextView) findViewById(R.id.yourTextView);

    tv.setText("To perform this exercise you will need the following: "
                        + System.getProperty("line.separator")//this takes you to the next Line
                        + System.getProperty("line.separator")
                        + Html.fromHtml(BULLET_SYMBOL + " Bed")
                        + System.getProperty("line.separator")
                        + Html.fromHtml(BULLET_SYMBOL + " Pillow"));
}

1

项目符号列表可以使用<ul>和简单地创建<li>字符串资源中标记。

不要使用 setText(Html.fromHtml(string))在代码中设置字符串!只需在xml中正常设置字符串或使用setText(string)即可。

例如:

strings.xml文件

<string name="str1">
    <ul>
        <li><i>first</i> item</li>
        <li>item 2</li>
    </ul>
</string>


layout.xml文件

<TextView
    android:text="@string/str1"
/>


它将产生以下结果:

  • 第一
  • 项目2


这样支持以下标记(直接嵌入在字符串资源中):

  • <a>(支持属性“ href”)
  • <注释>
  • <b>
  • <大>
  • <font>(支持整数形式的“高度”,“大小”,“ fgcolor”和“ bicolor”属性)
  • <i>
  • <li>
  • <字幕>
  • <小>
  • <罢工>
  • <sub>
  • <sup>
  • <tt>
  • <u>

您不需要<ul>
Blundell 2013年

5
不起作用。支持的html标签只有<b>,<i>和<u>。developer.android.com/guide/topics/resources/…–
Wooff

为我完美地工作!使所有工作正常运行的唯一要做的是将\ n放在每一行的开头。即\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
Jack T

1

因为single line text您可以简单地使用可绘制对象:

<TextView
    android:id="@+id/txtData"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableStart="@drawable/draw_bullet_list"
    android:drawablePadding="@dimen/padding_8dp"
    android:text="Hello"
    android:textColor="@color/colorBlack" />

draw_bullet_list.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/colorAccent" />

    <size
        android:width="12dp"
        android:height="12dp" />

</shape>

你可以改变shapesizecolor根据您的需要。


0

做项目符号列表的两个选项是

  • 使用html(ul,ol)创建列表并将html加载到WebView中
  • 将数据加载到ListView中,并将列表项布局中文本视图的左可绘制区域设置为适合项目符号的图像。

选项1是最简单的。



0

如果要创建带有editText结构的项目符号列表。

我受益于此参考

你可以用这个子弹

           EditText  edtNoteContent = findViewById(R.id.editText_description_note);            

        edtNoteContent.addTextChangedListener(new TextWatcher(){
            @Override
            public void afterTextChanged(Editable e) {

            }
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

            }
            @Override
            public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
            {
                if (lengthAfter > lengthBefore) {
                    if (text.toString().length() == 1) {
                        text = "◎ " + text;
                        edtNoteContent.setText(text);
                        edtNoteContent.setSelection(edtNoteContent.getText().length());
                    }
                    if (text.toString().endsWith("\n")) {
                        text = text.toString().replace("\n", "\n◎ ");
                        text = text.toString().replace("◎ ◎", "◎");
                        edtNoteContent.setText(text);
                        edtNoteContent.setSelection(edtNoteContent.getText().length());
                    }
                }
            }
        });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.