Ho cercato su Google la mia domanda ma non è stata fornita una risposta funzionante. Come aggiungere un elenco puntato alla mia visualizzazione di testo.
Ho cercato su Google la mia domanda ma non è stata fornita una risposta funzionante. Come aggiungere un elenco puntato alla mia visualizzazione di testo.
Risposte:
Difficile da fare poiché ul / li / ol non sono supportati. Fortunatamente puoi usarlo come zucchero sintattico:
• foo<br/>
• bar<br/>
• baz<br/>
•
è l'entità html per un elenco puntato più scelte sono qui http://www.elizabethcastro.com/html/extras/entities.html
ulteriori informazioni su quali tag sono supportati forniti da Mark Murphy (@CommonsWare) http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html Caricalo con Html.fromHtml
((TextView)findViewById(R.id.my_text_view)).setText(Html.fromHtml(myHtmlString));
<string name="string_name"><![CDATA[ • foo<br /> • bar... ]]></string>
browep ha spiegato bene il modo in cui l'HTML. La soluzione fornita con l'entità html può essere utile. Ma include solo il proiettile. Se il testo va a capo, il rientro non sarà corretto.
Ho trovato altre soluzioni che incorporano una visualizzazione web. Forse è appropriato per alcuni, ma penso che sia un po 'eccessivo ... (lo stesso con l'utilizzo di una visualizzazione elenco).
Mi piace l' approccio creativo di Nelson : D, ma non ti dà la possibilità di aggiungere un elenco non ordinato a una visualizzazione di testo.
Il mio esempio di un elenco non ordinato con punti elenco utilizzando 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:
Negativo:
Ho trovato un'alternativa .. copia semplicemente questo punto elenco "•" (è un testo) e incollalo nel testo della visualizzazione del testo, puoi cambiare il colore del punto cambiando il colore del testo e anche tutti gli altri attributi come dimensione, altezza larghezza. .. :)
puoi utilizzare la scorciatoia per ottenere questo punto durante la digitazione
per windows
ALT + 7
per mac
ALT + 8
Ispirato dalle varie risposte qui, ho creato una classe di utilità per renderlo facile . Questo creerà un elenco puntato con rientro per il testo avvolto. Ha metodi per combinare stringhe, risorse di stringhe e risorse di array di stringhe.
Creerà una CharSequence che puoi passare a TextView. Per esempio:
CharSequence bulletedList = BulletListUtil.makeBulletList("First line", "Second line", "Really long third line that will wrap and indent properly.");
textView.setText(bulletedList);
Spero sia utile. Godere.
Nota: in questo modo verrà utilizzato il punto elenco standard del sistema, un piccolo cerchio dello stesso colore del testo. Se vuoi un punto elenco personalizzato, considera la possibilità di creare una sottoclasse BulletSpan e sovrascriverlo drawLeadingMargin()
per disegnare il punto elenco che desideri. Dai un'occhiata alla fonte BulletSpan per avere un'idea di come funziona.
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;
}
}
Questo è di gran lunga il più semplice ..
<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>
Estensione Kotlin pronta per l'uso
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
}
}
}
Utilizzo:
val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList
Colori e dimensioni:
Per cambiare il colore o la dimensione del punto elenco, usa CustomBulletSpan invece di 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)
}
}
}
Un'opzione che ho usato era impostare il punto disegnabile usando uno stile.
<style name="Text.Bullet">
<item name="android:background">@drawable/bullet</item>
<item name="android:paddingLeft">10dp</item>
</style>
Utilizzo:
<TextView android:id="@+id/tx_hdr"
android:text="Item 1" style="@style/Text.Bullet" />
android:drawableLeft=
usa TextView semplice con un drawable composto. Per esempio
<TextView
android:text="Sample text"
android:drawableLeft="@drawable/bulletimage" >
</TextView>
Ecco un'altra soluzione, non aggiungere esattamente un elenco a una visualizzazione di testo, ma immagino che l'obiettivo sia lo stesso. Sta usando TableLayout, che richiede solo XML ed è davvero semplice per piccoli elenchi ordinati o non ordinati. Di seguito, il codice di esempio che ho usato per questo, non una riga di codice in Java.
Positivo:
Negativo:
ogni elemento dell'elenco viene archiviato come risorsa stringa separata
<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 lo stile:
<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>
Di seguito è riportato un elenco puntato con un'intestazione e una scheda davanti a ciascun elemento.
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();
}
}
È andato completamente eccessivo e ha creato una visualizzazione del testo personalizzata.
Usalo in questo modo:
<com.blundell.BulletTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="--bullet 1 --bullet two --bullet three --bullet four" />
e il codice:
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);
}
}
•
dovresti scegliere un altro simbolo fsymbols.com/signs/bullet-point
Trovo che questo sia il modo più semplice, lascia il textView così com'è nel file xml e usa il seguente codice java. ha funzionato perfettamente bene per me.
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"));
}
L'elenco puntato può essere creato semplicemente utilizzando <ul>
e<li>
tag nella risorsa stringa.
NON USARE setText (Html.fromHtml (string)) per impostare la stringa nel codice! Basta impostare la stringa normalmente in xml o utilizzando setText ( string ).
Per esempio:
file strings.xml
<string name="str1">
<ul>
<li><i>first</i> item</li>
<li>item 2</li>
</ul>
</string>
file layout.xml
<TextView
android:text="@string/str1"
/>
Produrrà il seguente risultato:
I seguenti tag sono supportati in questo modo (direttamente incorporati nella risorsa stringa):
<ul>
\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
Perché single line text
puoi semplicemente usare i drawables:
<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>
È possibile modificare shape
, size
, color
base alle proprie esigenze.
Le due opzioni che hai per fare un elenco puntato sono
L'opzione 1 è la più semplice.
un altro modo per supportare i tag HTML mancanti, è sostituirli bene, come mostrato qui
Se vuoi creare un elenco puntato con struttura editText.
Ho beneficiato di questi riferimenti
Puoi usare questi proiettili
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());
}
}
}
});