J'ai googlé ma question mais il n'y a pas de réponse de travail fournie. Comment ajouter une liste à puces à ma vue texte?.
Difficile à faire car les ul/li/ol ne sont pas supportés. Heureusement, vous pouvez utiliser ceci comme sucre syntaxique:
• foo<br/>
• bar<br/>
• baz<br/>
•
est l'entité html d'une liste. d'autres choix sont disponibles http://www.elizabethcastro.com/html/extras/entities.html
en savoir plus sur les balises prises en charge fournies par Mark Murphy (@CommonsWare) http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html Chargez ça avec Html.fromHtml
((TextView)findViewById(R.id.my_text_view)).setText(Html.fromHtml(myHtmlString));
browep a expliqué le chemin sur HTML. La solution fournie avec l'entité html peut être utile. Mais cela ne comprend que la balle. Si votre texte se termine, le retrait ne sera pas correct.
J'ai trouvé d'autres solutions intégrant une vue Web. C'est peut-être approprié pour certains, mais je pense que c'est un peu excessif ... (La même chose avec l'utilisation d'une liste.)
J'aime la approche créative de Nelson : D, mais cela ne vous donne pas la possibilité d'ajouter une liste non ordonnée à une vue texte.
Mon exemple d'une liste non ordonnée avec des puces en utilisant 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));
Positif:
Négatif:
J'ai trouvé une alternative .. copiez simplement cette puce "•" (c'est un texte) et collez-la dans le texte de votre affichage texte. Vous pouvez modifier la couleur de la puce en modifiant la couleur du texte, ainsi que tous les autres attributs tels que la taille, la hauteur, la largeur. .. :)
vous pouvez utiliser un raccourci pour obtenir cette puce lors de la frappe
pour les fenêtres
ALT + 7
pour Mac
ALT + 8
Inspiré par les différentes réponses données ici, j'ai créé une classe utilitaire pour en faire un support simple . Cela créera une liste à puces avec indentation pour le texte enveloppé. Il a des méthodes pour combiner des chaînes, des ressources de chaîne et des ressources de tableau de chaînes.
Cela créera un CharSequence que vous pourrez transmettre à un TextView. Par exemple:
CharSequence bulletedList = BulletListUtil.makeBulletList("First line", "Second line", "Really long third line that will wrap and indent properly.");
textView.setText(bulletedList);
J'espère que c'est utile. Prendre plaisir.
Remarque: Ceci utilisera la puce standard du système, un petit cercle de la même couleur que le texte. Si vous voulez une puce personnalisée, envisagez de sous-classer BulletSpan et de remplacer sa drawLeadingMargin()
pour dessiner la puce souhaitée. Jetez un coup d’œil à source BulletSpan pour avoir une idée de son fonctionnement.
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;
}
}
C'est de loin le plus facile ..
<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>
utiliser TextView simple avec un extractible composé. Par exemple
<TextView
Android:text="Sample text"
Android:drawableLeft="@drawable/bulletimage" >
</TextView>
Une option que j'ai utilisée consistait à définir la puce tirable à l'aide d'un style.
<style name="Text.Bullet">
<item name="Android:background">@drawable/bullet</item>
<item name="Android:paddingLeft">10dp</item>
</style>
Usage:
<TextView Android:id="@+id/tx_hdr"
Android:text="Item 1" style="@style/Text.Bullet" />
Voici une autre solution, qui ne consiste pas à ajouter une liste à une vue de texte, mais je suppose que le but est le même. Il utilise TableLayout, qui nécessite uniquement XML et est très simple pour les petites listes ordonnées ou non ordonnées. Ci-dessous, exemple de code que j'ai utilisé pour cela, pas une ligne de code en Java.
Positif:
Négatif:
chaque élément de la liste est stocké en tant que ressource de chaîne séparée
<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>
et le style:
<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>
Je suis allé trop loin et a créé une vue de texte personnalisée.
Utilisez-le comme ceci:
<com.blundell.BulletTextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="--bullet 1 --bullet two --bullet three --bullet four" />
et le code:
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);
}
}
Voici une liste à puces avec un en-tête et un onglet devant chaque élément.
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();
}
}
Je trouve que cela est le moyen le plus simple, laissez le textView tel quel dans le fichier xml et utilisez le code Java) suivant. Cela a parfaitement fonctionné pour moi.
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"));
}
La liste à puces peut être simplement créée en utilisant le <ul>
et <li>
balises dans la ressource chaîne.
NE PAS UTILISER setText (Html.fromHtml (chaîne)) pour définir la chaîne dans le code! Il suffit de définir la chaîne normalement en XML ou en utilisant setText ( string ).
Par exemple:
fichier strings.xml
<string name="str1"><ul> <li><i>first</i> item</li> <li>item 2</li> </ul></string>
fichier layout.xml
<TextView
Android:text="@string/str1"
/>
Cela produira le résultat suivant:
Les balises suivantes sont supportées comme ceci (directement intégrées dans la ressource chaîne):
Les deux options que vous avez pour faire une liste à puces sont
L'option 1 est la plus simple.
extension Kotlin prête à l'emploi
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
}
}
}
tilisation:
val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList
une autre façon de prendre en charge les balises HTML manquantes consiste à les remplacer correctement, comme indiqué ici