Подтвердить что ты не робот

Как добавить маркированный список в приложение для Android?

У меня есть вопрос, связанный с Google, но нет ответа на этот вопрос. Как добавить маркированный список в текстовое окно.

4b9b3361

Ответ 1

Трудно делать, поскольку ul/li/ol не поддерживается. К счастью, вы можете использовать это как синтаксический сахар:

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

&#8226; - это объект html для списка bullet здесь больше вариантов http://www.elizabethcastro.com/html/extras/entities.html

больше о том, какие теги поддерживаются Марком Мерфи (@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));

Ответ 2

  1. browep хорошо объяснил путь через HTML. Предоставленное решение с сущностью html может быть полезным. Но это включает только пулю. Если ваш текст переносится, отступ не будет правильным.

  2. Я нашел другие решения, встраивающие веб-представление. Возможно, это подходит для некоторых, но я думаю, что это своего рода излишнее... (То же самое с использованием представления списка.)

  3. Мне нравится творческий подход Нельсона: 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.

Ответ 3

Я нашел альтернативу... просто скопируйте эту маркеру "•" (это текст) и вставьте текст текстового просмотра, вы можете изменить цвет пули, изменив цвет текста, а также все другие атрибуты, такие как размер, высота ширина...:)

вы можете использовать короткую вырезку, чтобы получить эту пулю, набрав

для окон

ALT + 7

для mac

ALT + 8

Ответ 4

Вдохновленный различными ответами здесь, я создал класс 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;
}

}

Ответ 5

Это, безусловно, самый простой.

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

Ответ 6

Вариант, который я использовал, заключался в том, чтобы установить маркер с помощью стиля.

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

Ответ 7

используйте простой TextView с составным ресурсом. Например

<TextView     
    android:text="Sample text"
    android:drawableLeft="@drawable/bulletimage" >
</TextView>

Ответ 8

Здесь другое решение, а не точное добавление списка в один текстовый просмотр, но я думаю, что цель та же. Он использует TableLayout, которому нужен только XML, и он очень прост для небольших упорядоченных или неупорядоченных списков. Ниже приведен пример кода, который я использовал для этого, а не строка кода в Java.

Positive:

  • вы можете поместить все, что угодно, в строки таблицы, не обязательно должны быть textview
  • вы можете использовать его для создания маркированного и нумерованного списка или любого другого
  • вы можете определить отступ с помощью padding или layout_weight

Отрицательный:

  • утомительный для очень длинных списков (если вы не используете какой-то хитрый текстовый редактор с регулярным выражением)
  • каждый элемент списка хранится как отдельный ресурс строки

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

Ответ 9

Вот маркированный список с заголовком и вкладкой перед каждым элементом.

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

}

Ответ 10

Перестал полностью перегружать и сделал пользовательский текстовый вид.

Используйте его следующим образом:

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

}

Ответ 11

Я считаю, что это самый простой способ, оставить 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"));
}

Ответ 12

Готовое расширение Kotlin

fun List<String>.toBulletedList(): CharSequence {
    return SpannableString(this.joinToString("\n")).apply {
        [email protected](0) { index, acc, span ->
            val end = acc + span.length + if (index != [email protected] - 1) 1 else 0
            this.setSpan(BulletSpan(16), acc, end, 0)
            end
        }
    }
}

Использование:

val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList

Ответ 13

Два параметра, которые вы делаете для маркированного списка:

  • создайте список, используя html (ul, ol) и загрузите html в WebView
  • Загрузите данные в ListView и установите левое выделение текстового вида в макете списка, подходящее изображение для пули.

Вариант 1 является самым простым.

Ответ 14

Маркированный список можно просто создать, используя теги <ul> и <li> в ресурсе строки.

НЕ ИСПОЛЬЗУЙТЕ setText (Html.fromHtml(строка)), чтобы установить строку в код! Просто установите строку обычно в 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


Поддерживаются следующие теги (непосредственно встроенные в ресурс строки):

  • < > (поддерживает атрибуты "href" )
  • < аннотации >
  • < б >
  • < большой >
  • < шрифт > (поддерживает атрибуты "высота", "размер", "fgcolor" и "bicolor", как целые числа).
  • < я >
  • <Li>
  • < шатровый >
  • < небольшие >
  • < & удара GT;
  • < суб >
  • < вечерять >
  • < тт >
  • < у >

Ответ 15

Другой способ поддержки отсутствующих тегов HTML - это заменить их красиво, как показано здесь