ฉันตอบคำถามของฉันไปแล้วแต่ไม่มีคำตอบที่ได้ผล จะเพิ่มรายการสัญลักษณ์แสดงหัวข้อย่อยใน textview ของฉันได้อย่างไร
ฉันตอบคำถามของฉันไปแล้วแต่ไม่มีคำตอบที่ได้ผล จะเพิ่มรายการสัญลักษณ์แสดงหัวข้อย่อยใน textview ของฉันได้อย่างไร
คำตอบ:
ยากที่จะทำตามที่ไม่รองรับ ul / li / ol โชคดีที่คุณสามารถใช้สิ่งนี้เป็นน้ำตาลซินแทติก:
• foo<br/>
• bar<br/>
• baz<br/>
•
เป็นเอนทิตี html สำหรับสัญลักษณ์แสดงหัวข้อย่อยรายการตัวเลือกเพิ่มเติมอยู่ที่นี่http://www.elizabethcastro.com/html/extras/entities.html
เพิ่มเติมเกี่ยวกับแท็กที่ได้รับการสนับสนุนโดย Mark Murphy (@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));
<string name="string_name"><![CDATA[ • foo<br /> • bar... ]]></string>
browep อธิบายดีกว่า HTML โซลูชันที่ให้มาพร้อมกับเอนทิตี html จะมีประโยชน์ แต่รวมเฉพาะสัญลักษณ์แสดงหัวข้อย่อย หากข้อความของคุณปิดการเยื้องจะไม่ถูกต้อง
ฉันพบโซลูชันอื่นที่ฝังมุมมองเว็บ นั่นอาจจะเหมาะสมสำหรับบางคน แต่ฉันคิดว่ามันเกินความจำเป็น ... (เช่นเดียวกับการใช้มุมมองรายการ)
ฉันชอบแนวทางสร้างสรรค์ของ Nelson : 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));
บวก:
เชิงลบ:
ฉันพบทางเลือกอื่น .. เพียงคัดลอกสัญลักษณ์แสดงหัวข้อย่อย "•" (เป็นข้อความ) และวางในข้อความของมุมมองข้อความของคุณคุณสามารถเปลี่ยนสีสัญลักษณ์แสดงหัวข้อย่อยได้โดยการเปลี่ยนสีข้อความและคุณลักษณะอื่น ๆ ทั้งหมดเช่นขนาดความกว้างความสูง .. :)
คุณสามารถใช้ทางลัดเพื่อรับสัญลักษณ์แสดงหัวข้อย่อยนี้ขณะพิมพ์
สำหรับ 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เพื่อดูวิธีการทำงาน
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;
}
}
นี่เป็นวิธีที่ง่ายที่สุด ..
<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>
ส่วนขยาย 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
}
}
}
การใช้งาน:
val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList
สีและขนาด:
ในการเปลี่ยนสีหรือขนาดสัญลักษณ์แสดงหัวข้อย่อยให้ใช้ CustomBulletSpan แทน 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)
}
}
}
ตัวเลือกที่ฉันใช้คือตั้งค่าสัญลักษณ์แสดงหัวข้อย่อยที่วาดได้โดยใช้สไตล์
<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" />
android:drawableLeft=
ใช้ TextView แบบง่ายพร้อมสารประกอบที่วาดได้ ตัวอย่างเช่น
<TextView
android:text="Sample text"
android:drawableLeft="@drawable/bulletimage" >
</TextView>
นี่เป็นวิธีแก้ปัญหาอีกวิธีหนึ่งไม่ใช่การเพิ่มรายการลงใน textview เดียว แต่ฉันเดาว่าเป้าหมายเหมือนกัน มันใช้ TableLayout ซึ่งต้องการเพียง XML และมันง่ายมากสำหรับรายการสั่งซื้อขนาดเล็กหรือไม่เรียงลำดับ ด้านล่างนี้เป็นโค้ดตัวอย่างที่ฉันใช้สำหรับสิ่งนี้ไม่ใช่โค้ดบรรทัดใน Java
บวก:
เชิงลบ:
ทุกรายการจะถูกจัดเก็บเป็นทรัพยากรสตริงแยกกัน
<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>
นี่คือรายการสัญลักษณ์แสดงหัวข้อย่อยที่มีส่วนหัวและแท็บด้านหน้าของแต่ละรายการ
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);
}
}
•
คุณจะต้องเลือกสัญลักษณ์อื่นfsymbols.com/signs/bullet-point
รายการสัญลักษณ์แสดงหัวข้อย่อยสามารถสร้างได้ง่ายๆโดยใช้<ul>
และ<li>
แท็กในทรัพยากรสตริง
อย่าใช้ setText (Html.fromHtml (string))เพื่อตั้งค่าสตริงในโค้ด! เพียงตั้งค่าสตริงตามปกติใน xml หรือโดยใช้ setText ( สตริง )
เช่น:
ไฟล์ 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"
/>
มันจะให้ผลลัพธ์ดังต่อไปนี้:
แท็กต่อไปนี้ได้รับการสนับสนุนเช่นนี้ (ฝังโดยตรงในทรัพยากรสตริง):
<ul>
\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดให้ปล่อย 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"));
}
สำหรับsingle line text
คุณสามารถใช้ 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>
คุณสามารถเปลี่ยนshape
, size
, color
ขึ้นอยู่กับความต้องการของคุณ
สองตัวเลือกที่คุณมีสำหรับการทำรายการสัญลักษณ์แสดงหัวข้อย่อยคือ
ทางเลือกที่ 1 ง่ายที่สุด
ถ้าคุณต้องการสร้าง bullet list ที่มีโครงสร้าง editText
ฉันได้รับประโยชน์จากการอ้างอิงนี้
คุณสามารถใช้สัญลักษณ์แสดงหัวข้อย่อยนี้
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());
}
}
}
});