it-swarm-ru.tech

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

Я погуглил свой вопрос, но не дал рабочего ответа. Как добавить маркированный список в мое текстовое представление.

83
user590849

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

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

&#8226; - это html-сущность для списка. Больше вариантов здесь 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));
176
browep
  1. объяснил Броуэп: Хороший путь по 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.
51
Diego Frehner

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

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

для окон

ALT + 7

для Mac

ALT + 8

31
Ishtiaq

Вдохновленный различными ответами здесь, я создал служебный класс, чтобы сделать его простым . Это создаст маркированный список с отступом для переносимого текста. У него есть методы для объединения строк, строковых ресурсов и ресурсов строковых массивов.

Это создаст последовательность 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;
}

}
21
cottonBallPaws

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

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

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

<TextView     
    Android:text="Sample text"
    Android:drawableLeft="@drawable/bulletimage" >
</TextView>
4
Nouman Hanif

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

<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" />
4
Nelson Ramirez

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

Положительный:

  • вы можете поместить все, что вам нравится в строках таблицы, не обязательно должно быть текстовое представление
  • вы можете использовать его для создания маркированного и нумерованного списка или чего-либо еще
  • вы можете определить отступ, используя 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>
3
dorsz

Пошел полностью перебор и сделал пользовательский просмотр текста.

Используйте это так:

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

}
2
Blundell

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

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

Я считаю, что это самый простой способ, оставьте 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
fernand bontemps

Маркированный список можно просто создать с помощью тегов <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")
  • <Аннотаций>
  • <Б>
  • <Большой>
  • <font> (поддерживает атрибуты "height", "size", "fgcolor" и "bicolor" как целые числа)
  • <Я>
  • <Li>
  • <Marquee>
  • <Маленький>
  • <Удар>
  • <Суб>
  • <SUP>
  • <Тт>
  • <И>
0
Abhishek

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

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

Вариант 1 самый простой.

0
Robby Pond

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

0
android developer