내 질문을 검색했지만 제공된 답변이 없습니다. 내 텍스트보기에 글 머리 기호 목록을 어떻게 추가합니까?
내 질문을 검색했지만 제공된 답변이 없습니다. 내 텍스트보기에 글 머리 기호 목록을 어떻게 추가합니까?
답변:
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
여기에있는 다양한 답변에 영감을 받아 유틸리티 클래스를 만들었습니다 . 이렇게하면 줄 바꿈 된 텍스트에 대한 들여 쓰기가있는 글 머리 기호 목록이 생성됩니다. 문자열, 문자열 리소스 및 문자열 배열 리소스를 결합하는 방법이 있습니다.
TextView에 전달할 수있는 CharSequence를 생성합니다. 예를 들면 :
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;
}
}
즉시 사용 가능한 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
색상 및 크기 :
글 머리 기호 색상 또는 크기를 변경하려면 BulletSpan 대신 CustomBulletSpan을 사용하십시오.
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=
여기에 하나의 텍스트 뷰에 목록을 정확하게 추가하지 않는 또 다른 솔루션이 있지만 목표는 동일하다고 생각합니다. XML 만 필요로하는 TableLayout을 사용하고 있으며 작은 순서 또는 순서없는 목록에 대해 정말 간단합니다. 아래는 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
이것이 가장 쉬운 방법이라고 생각하고 textView를 xml 파일에 그대로두고 다음 자바 코드를 사용합니다. 그것은 나를 위해 완벽하게 잘 작동했습니다.
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"));
}
글 머리 기호 목록은 <ul>
및 사용하여 간단하게 만들 수 있습니다.<li>
문자열 리소스에서 태그를 .
코드에서 문자열을 설정하기 위해 setText (Html.fromHtml (string)) 을 사용하지 마십시오 ! xml 또는 setText ( string )를 사용하여 문자열을 정상적으로 설정하십시오 .
예 :
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>
들어 single line text
당신은 단순히 드로어 블을 사용할 수 있습니다 :
<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
귀하의 요구 사항에 따라.
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());
}
}
}
});