Как добавить маркированный список в приложение для android?
я погуглил на мой вопрос, но там не работает ответ. Как добавить маркированный список в мой textview.
14 ответов:
трудно сделать, как ul / li / ol не поддерживаются. К счастью, вы можете использовать это как синтаксический сахар:
• foo<br/> • bar<br/> • baz<br/>
•
является ли 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));
бровеп объяснил хороший путь через HTML. предоставленное решение с HTML-сущностью может быть полезно. Но в него входит только пуля. Если ваш текст переносится, отступ не будет правильным.
Я нашел другие решения, внедрение веб-просмотра. Это, возможно, подходит для некоторых, но я думаю, что это своего рода перебор... (То же самое с использованием представления списка.)
мне нравится творческий подход Нельсон: 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));
плюсы:
- пули с правильным отступом после обертывания текста.
- вы можете объединить другой форматированный или не форматированный текст в одном экземпляре TextView
- Вы можете определить в Конструктор BulletSpan как большой отступ должен быть.
отрицательные:
- вы должны сохранить каждый элемент списка в отдельной строке ресурса. Поэтому вы не можете определить свой список, что удобно, как вы могли бы в HTML.
Я нашел другую.. просто скопируйте этот маркер " • " (это текст) и вставьте в текст вашего текстового представления, вы можете изменить цвет маркера, изменив цвет текста, а также все другие атрибуты, такие как размер, ширина высоты... :)
вы можете использовать короткий путь, чтобы получить эту пулю при вводе
для windows
ALT + 7
для mac
ALT + 8
вдохновленный различными ответами здесь, я создал класс полезности, чтобы сделать это легко один лайнер. Это создаст маркированный список с отступом для обернутого текста. Он имеет методы для объединения строк, строковых ресурсов и ресурсов массива строк.
это создаст 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 source для идеи, как это работает.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; } }
вариант, который я использовал, состоял в том, чтобы установить маркер drawable с помощью стиля.
<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" />
используйте простой TextView с составным drawable. Например
<TextView android:text="Sample text" android:drawableLeft="@drawable/bulletimage" > </TextView>
Это самый простой..
<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>
вот маркированный список с заголовком и вкладкой перед каждым элементом.
public class BulletListBuilder { private static final String SPACE = " "; private static final String BULLET_SYMBOL = "•"; 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(); } }
пошел полностью перебор и сделал пользовательский текстовый вид.
используйте его так:
<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 = "•"; 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); } }
вот еще одно решение, не совсем добавление списка в один textview, но я думаю, что цель та же. Он использует TableLayout, который нуждается только в XML, и это действительно просто для небольших упорядоченных или неупорядоченных списков. Ниже приведен пример кода, который я использовал для этого, а не строка кода в Java.
плюсы:
- вы можете поместить все, что вам нравится в строках таблицы, не должно быть 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>
Я считаю, что это самый простой способ, оставьте textView, как он есть в xml-файле, и используйте следующий код java. это прекрасно работало для меня.
private static final String BULLET_SYMBOL = "•"; @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")); }
два варианта у вас есть для выполнения маркированного списка
- создайте список с помощью html (ul, ol) и загрузите html в WebView
- загрузите данные в ListView и установите левый drawable вашего текстового представления в макете элемента списка, чтобы подходящее изображение для пули.
Вариант 1 Самый простой.
маркированный список может быть просто создан с помощью
<ul>
и<li>
теги в строковом ресурсе.НЕ ИСПОЛЬЗОВАТЬsetText (Html.fromHtml(строку)) чтобы установить строку в коде! Просто установите строку обычно в xml или с помощью setText(строка).
например:
строки.xml-файл
<string name="str1"><ul> <li><i>first</i> item</li> <li>item 2</li> </ul></string>
макет.xml-файл<TextView android:text="@string/str1" />
Оно будет произведите следующий результат:
- первый item
- пункт 2
Следующие теги поддерживаются следующим образом (непосредственно встроенные в строковый ресурс):
- (поддерживает атрибуты "href")
- (поддерживает атрибуты "высота", "размер", "fgcolor" и "bicolor", как целые числа)
еще один способ поддержки отсутствующих тегов HTML-это их хорошая замена, как показано здесь