Como adicionar lista com marcadores para aplicação android?

votos
73

Eu pesquisei minha pergunta, mas lá não está funcionando resposta dada. Como adicionar uma lista com marcadores para o meu textview.

Publicado 14/02/2011 em 14:38
fonte usuário
Em outras línguas...                            


15 respostas

votos
164

Difícil de fazer como ul / li / ol não são suportados. Felizmente, você pode usar isso como açúcar sintático:

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

&#8226;é a entidade html para uma bala lista mais opções está aqui http://www.elizabethcastro.com/html/extras/entities.html

mais sobre quais tags são suportadas fornecido por Mark Murphy (@CommonsWare) http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html Coloque-se que com Html.fromHtml

((TextView)findViewById(R.id.my_text_view)).setText(Html.fromHtml(myHtmlString));
Respondeu 05/05/2011 em 02:36
fonte usuário

votos
46
  1. browep explicou agradável a maneira sobre HTML. A solução fornecida com a entidade html pode ser útil. Mas inclui apenas a bala. Se o seu texto é disposto, o recuo não será correto.

  2. Eu encontrei outras soluções incorporação de uma visão web. Que talvez seja apropriado para alguns, mas eu acho que é tipo de exagero ... (O mesmo com o uso de uma lista.)

  3. Eu gosto da abordagem criativa de Nelson : D, mas não lhe dá a possibilidade de adicionar uma lista não ordenada a uma exibição de texto.

  4. Meu exemplo de uma lista não ordenada com balas usando 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));
    

Positivo:

  • Balas com travessão correta após wraps texto.
  • Você pode combinar outro texto formatado formatados ou não em uma instância do TextView
  • Você pode definir no construtor BulletSpan quão grande é o travessão deve ser.

Negativo:

  • Você tem que salvar cada item da lista em um recurso de cadeia separada. Então u não pode definir sua lista que confortável como você poderia, em HTML.
Respondeu 05/08/2011 em 11:33
fonte usuário

votos
22

Eu encontrei uma alternativa .. basta copiar este bala "•" (é um texto) e colar no texto de seu ponto de vista de texto, você pode mudar a cor da bala, alterando o textcolor e assim todos os outros atributos como tamanho, largura altura. .. :)

você pode usar de atalho para obter a bala durante a digitação

para Windows

ALT + 7

para Mac

ALT + 8

Respondeu 11/04/2012 em 05:32
fonte usuário

votos
15

Inspirado pelas várias respostas aqui, eu criei uma classe utilitário para tornar este um um forro fácil . Isto irá criar uma lista com marcadores com recuo para texto envolvido. Ele tem métodos para cordas combinando, recursos de cordas e recursos matriz de cadeia.

Ele vai criar uma CharSequence que você pode passar a um TextView. Por exemplo:

CharSequence bulletedList = BulletListUtil.makeBulletList("First line", "Second line", "Really long third line that will wrap and indent properly.");
textView.setText(bulletedList);

Espero que seja útil. Apreciar.

Nota: Isto irá usar a bala padrão de sistema, um pequeno círculo da mesma cor que o texto. Se você quer uma bala costume, considere subclasse BulletSpan e substituindo seu drawLeadingMargin()desenhar a bala que você deseja. Dê uma olhada na fonte BulletSpan para uma idéia de como ele funciona.

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

}
Respondeu 15/01/2015 em 12:07
fonte usuário

votos
4

usar TextView simples, com um composto susceptível de ser estirado. Por exemplo

<TextView     
    android:text="Sample text"
    android:drawableLeft="@drawable/bulletimage" >
</TextView>
Respondeu 26/05/2014 em 16:54
fonte usuário

votos
4

Uma opção que eu usei foi para definir o drawable bala usando um estilo.

<style name="Text.Bullet">
    <item name="android:background">@drawable/bullet</item>
    <item name="android:paddingLeft">10dp</item>
</style>

Uso:

<TextView android:id="@+id/tx_hdr" 
android:text="Item 1" style="@style/Text.Bullet" />
Respondeu 10/05/2011 em 17:20
fonte usuário

votos
3

Esta é de longe o mais fácil ..

<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>
Respondeu 12/04/2016 em 07:06
fonte usuário

votos
2

Fui completamente exagero e fez uma exibição de texto personalizado.

Usá-lo como este:

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

e o código:

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

}
Respondeu 02/09/2013 em 16:18
fonte usuário

votos
2

Aqui está uma lista com marcadores com um cabeçalho e uma guia na frente de cada item.

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

}
Respondeu 01/04/2013 em 13:21
fonte usuário

votos
1

Aqui está uma outra solução, não exatamente a adição de uma lista para uma textview, mas acho que o objetivo é o mesmo. Ele está usando TableLayout, que precisa apenas de XML e é realmente simples para pequenas listas ordenadas ou desordenadas. Abaixo, o código de exemplo que eu usei para isso, não uma linha de código em Java.

Positivo:

  • você pode colocar o que quiser em linhas da tabela, não tem que ser um textview
  • você pode usá-lo para criar uma lista com marcadores e numeradas ou qualquer outra coisa
  • você pode definir recuo usando preenchimento ou layout_weight

Negativo:

  • tedioso para listas muito longas (a menos que você usar algum editor de texto astuto com regex)
  • cada item da lista é a loja como um recurso de cadeia separada

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

e o estilo:

<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>
Respondeu 27/08/2015 em 20:18
fonte usuário

votos
1

Eu acho que isso seja a maneira mais fácil, deixar o textView como é no arquivo xml e utilizar o seguinte código java. ele funcionou perfeitamente bem para mim.

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"));
}
Respondeu 20/06/2013 em 09:23
fonte usuário

votos
0

-To-use pronto extensão 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
        }
    }
}

Uso:

val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList
Respondeu 29/07/2019 em 17:25
fonte usuário

votos
0

Outra maneira de apoiar as tags HTML que faltam, é, substituindo-os bem, como mostrado aqui

Respondeu 01/03/2014 em 17:17
fonte usuário

votos
0

Lista com marcadores pode ser simplesmente criado usando o <ul>e <li>marcas no recurso de cadeia.

NÃO USE setText (Html.fromHtml (string)) para definir a seqüência em código! Basta definir a string normalmente em xml ou usando setText ( corda ).

Por exemplo:

arquivo strings.xml

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


arquivo layout.xml

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


Ela irá produzir o seguinte resultado:

  • primeiro artigo
  • ponto 2


Seguintes tags são suportados como este (incorporado diretamente no recurso string):

  • <a> (suporta atributos "href")
  • <Anotação>
  • <B>
  • <Big>
  • <Font> (suporta atributos "altura", "tamanho", "fgColor" e "bicolor", como inteiros)
  • <I>
  • <Li>
  • <Marquee>
  • <Small>
  • <Strike>
  • <Sub>
  • <Sup>
  • <Tt>
  • <U>
Respondeu 08/05/2013 em 13:57
fonte usuário

votos
0

As duas opções que você tem para fazer uma lista com marcadores são

  • criar a lista utilizando HTML (ul, ol) e carregar o HTML num WebView
  • Carregar os dados em um ListView e definir o drawable esquerdo de sua exibição de texto no layout item da lista, para uma imagem adequada para a bala.

Opção 1 é o mais fácil.

Respondeu 14/02/2011 em 14:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more