글 머리 기호 목록을 Android 애플리케이션에 추가하는 방법은 무엇입니까?


91

내 질문을 검색했지만 제공된 답변이 없습니다. 내 텍스트보기에 글 머리 기호 목록을 어떻게 추가합니까?

답변:


189

ul / li / ol로하기 힘든 것은 지원되지 않습니다. 다행히도 이것을 구문 설탕으로 사용할 수 있습니다.

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

&#8226;목록 글 머리 기호에 대한 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));

1
Commonsware 사이트에 대한 링크를 주셔서 감사합니다. 한동안 그런 것을 찾고있었습니다!
Norman H

4
values ​​/ strings.xml에서 문자열을 가져 오는 경우 (context.getString (R.string.yourstring); 사용), CDATA 로 래핑해야합니다 . <string name="string_name"><![CDATA[ &#8226; foo<br /> &#8226; bar... ]]></string>
Quentin S.

5
글 머리 기호 항목에 두 줄 이상의 줄이 있으면 작동하지 않습니다
thepoosh

ul/ li현재 지원되는 것처럼 보입니다. stackoverflow.com/questions/9754076/…
hmac

55
  1. browep은 HTML을 통해 멋지게 설명했습니다. html 엔터티와 함께 ​​제공된 솔루션이 유용 할 수 있습니다. 하지만 총알 만 포함됩니다. 텍스트가 줄 바꿈되면 들여 쓰기가 올바르지 않습니다.

  2. 웹보기를 포함하는 다른 솔루션을 찾았습니다. 일부에게는 적절할 수도 있지만 과잉이라고 생각합니다 ... (목록보기를 사용하는 것과 동일합니다.)

  3. 저는 Nelson : D 의 창의적인 접근 방식을 좋아 하지만 텍스트보기에 정렬되지 않은 목록을 추가 할 가능성을 제공하지 않습니다.

  4. 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));
    

양:

  • 텍스트 줄 바꿈 후 올바른 들여 쓰기가있는 글 머리 기호.
  • 하나의 TextView 인스턴스에서 서식이 지정되거나 서식이 지정되지 않은 다른 텍스트를 결합 할 수 있습니다.
  • BulletSpan 생성자에서 들여 쓰기의 크기를 정의 할 수 있습니다.

부정:

  • 목록의 모든 항목을 별도의 문자열 리소스에 저장해야합니다. 그래서 당신이 HTML에서 할 수있는 방법만큼 편안하게 목록을 정의 할 수 없습니다.

1
이 접근 방식 (정확히 모방)은 2.2에서 작동하지 않습니다. 당신은 단 하나의 총알로 끝납니다.
Skone

안녕하세요 Skone, 2.2 에뮬레이터 및 원래 Android 빌드에서 작동합니다. 총알과 텍스트 사이의 공백이 무시 된 안드로이드 버전을 보았습니다. 그러나 총알은 여전히 ​​나타났습니다. 총알 문자열 끝에 새 줄이 있습니까?
Diego Frehner 2011 년

이 솔루션은 textview에서 줄 간격을 변경할 때 작동하지 않습니다
Marqs

BulletSpan을 사용하는 훌륭한 방법은 완벽하게 작동하며 매우 쉽습니다!
Moonbloom

7
위의 코드는 저에게 효과적입니다 !!! 내가해야 할 일은 xml의 모든 문자열 끝에 "\ n"을 추가하는 것
뿐입니다

38

대체 항목을 찾았습니다.이 글 머리 기호 "•"(텍스트)를 복사하고 텍스트보기의 텍스트에 붙여 넣으십시오. 텍스트 색상과 크기, 높이 너비와 같은 다른 모든 속성을 변경하여 글 머리 기호 색상을 변경할 수 있습니다. .. :)

바로 가기를 사용하여 입력하는 동안이 글 머리 기호를 얻을 수 있습니다.

Windows 용

ALT + 7

Mac 용

Alt + 8


2
Alt + 7은 나에게 작동하지 않지만 (아마도 Mac 또는 Linux의 유일한 것임) 유니 코드 문자를 복사하여 붙여 넣는 것은 • 작동했습니다.
Jon

2
참고 : ALT + 7은 키보드에 별도의 숫자 패드가있는 경우에만 작동합니다.
Aks4125

코드, 즉 문자열에 기호를 붙여 넣는 경우 ASCII가 아닌 문자 및 파일 인코딩 문제를 염두에 두십시오 (IntelliJ의 오른쪽 하단 모서리에서 파일 인코딩을 변경해보십시오). 해당 이스케이프 시퀀스 (예 : \ u1234)를 사용하는 것이 더 좋습니다.
Gil Vegliach

가는 길 !! 깡패 인생!
goonerDroid

2
\ u2022가 정답입니다
user2322082 '1711.07

21

여기에있는 다양한 답변에 영감을 받아 유틸리티 클래스를 만들었습니다 . 이렇게하면 줄 바꿈 된 텍스트에 대한 들여 쓰기가있는 글 머리 기호 목록이 생성됩니다. 문자열, 문자열 리소스 및 문자열 배열 리소스를 결합하는 방법이 있습니다.

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

}

친애하는 선생님 감사합니다! 나는 makeBulletList 함수를 사용했고 그것은 매력처럼 작동합니다. : D
Aba

그것은 굉장! ) 감사합니다
kulikovman

10

이것이 가장 쉬운 방법입니다 ..

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

8

즉시 사용 가능한 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)
        }
    }
}

글 머리 기호의 크기를 텍스트 크기에 맞게 변경할 수 있습니까?
nenur

@NoahTanenholtz 당신은 BulletSpan () 인수의 값을 변경하여 총알 크기를 늘릴 수 있습니다
미하일 Sharin에게

아, 나는 간격라고 생각
nenur

총알 크기 ​​대신 간격이 늘어남) :
Sumit Shukla

@SumitShukla 의견 주셔서 감사합니다. 방금 BulletCustomSpan을 색상 및 크기 사용자 정의에 추가했습니다
Mikhail Sharin

4

내가 사용한 옵션은 스타일을 사용하여 총알 드로어 블을 설정하는 것입니다.

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

드로어 블을 위해 웹에서 작은 총알 사진을 가져 왔습니다. Eclipse의 그래픽 레이아웃은 텍스트 아래에 펼쳐진 그래픽을 보여줍니다.
JohnK

1
나는 그가 의미 생각android:drawableLeft=
Blundell은

4

복합 드로어 블과 함께 간단한 TextView를 사용하십시오. 예를 들면

<TextView     
    android:text="Sample text"
    android:drawableLeft="@drawable/bulletimage" >
</TextView>

3

여기에 하나의 텍스트 뷰에 목록을 정확하게 추가하지 않는 또 다른 솔루션이 있지만 목표는 동일하다고 생각합니다. XML 만 필요로하는 TableLayout을 사용하고 있으며 작은 순서 또는 순서없는 목록에 대해 정말 간단합니다. 아래는 Java 코드가 아니라 제가 사용한 샘플 코드입니다.

양:

  • 원하는 것을 테이블 행에 넣을 수 있습니다. textview 일 필요는 없습니다.
  • 글 머리 기호 및 번호 매기기 목록 등을 만드는 데 사용할 수 있습니다.
  • padding 또는 layout_weight를 사용하여 들여 쓰기를 정의 할 수 있습니다.

부정:

  • 매우 긴 목록에 지루함 (정규식과 함께 교활한 텍스트 편집기를 사용하지 않는 한)
  • 모든 목록 항목은 별도의 문자열 리소스로 저장됩니다.

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

2

다음은 각 항목 앞에 머리글과 탭이있는 글 머리 기호 목록입니다.

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

}

2

완전히 과도하게 사용자 지정 텍스트보기를 만들었습니다.

다음과 같이 사용하십시오.

<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 = "&#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);
    }

}

총알 크기와 간격을 어떻게 늘릴 수 있습니까?
Sumit Shukla

이 예에서는 &#8226;다른 기호 fsymbols.com/signs/bullet-point
Blundell

1

이것이 가장 쉬운 방법이라고 생각하고 textView를 xml 파일에 그대로두고 다음 자바 코드를 사용합니다. 그것은 나를 위해 완벽하게 잘 작동했습니다.

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

1

글 머리 기호 목록은 <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"
/>


다음 결과가 생성됩니다.

  • 먼저 항목
  • 항목 2


다음과 같은 태그가 지원됩니다 (문자열 리소스에 직접 포함됨).

  • <a> ( "href"속성 지원)
  • <주석>
  • <b>
  • <큰>
  • <font> ( "height", "size", "fgcolor"및 "bicolor"속성을 정수로 지원)
  • <i>
  • <li>
  • <마키>
  • <소>
  • <스트라이크>
  • <sub>
  • <sup>
  • <tt>
  • <u>

당신은 필요하지 않습니다<ul>
Blundell은

5
작동하지 않습니다. 지원되는 html 태그는 <b>, <i> 및 <u> 만 있습니다. developer.android.com/guide/topics/resources/…
Wooff

나를 위해 완벽하게 작동했습니다! 모든 것이 작동하도록하기 위해 내가해야 할 유일한 일은 각 줄의 시작 부분에 \ n 을 넣는 것뿐이었습니다 . 즉\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
Jack T

1

들어 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귀하의 요구 사항에 따라.


0

글 머리 기호 목록을 작성하는 데 사용할 수있는 두 가지 옵션은 다음과 같습니다.

  • html (ul, ol)을 사용하여 목록을 만들고 html을 WebView에로드합니다.
  • 데이터를 ListView에로드하고 목록 항목 레이아웃에서 텍스트보기의 왼쪽 드로어 블을 글 머리 기호에 적합한 이미지로 설정합니다.

옵션 1이 가장 쉽습니다.



0

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());
                    }
                }
            }
        });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.