Android uygulamasına madde işaretli liste nasıl eklenir?


91

Sorumu Google'da inceledim ancak çalışan bir yanıt sağlanmadı. Metin görünümüme nasıl madde işaretli liste eklerim?

Yanıtlar:


189

Ul / li / ol olarak yapılması zor desteklenmez. Neyse ki bunu sözdizimsel şeker olarak kullanabilirsiniz:

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

&#8226;bir liste için html varlığıdır madde işareti daha fazla seçenek burada http://www.elizabethcastro.com/html/extras/entities.html

Mark Murphy (@CommonsWare) tarafından hangi etiketlerin desteklendiği hakkında daha fazla bilgi http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html Bunu Html.fromHtml ile yükleyin

((TextView)findViewById(R.id.my_text_view)).setText(Html.fromHtml(myHtmlString));

1
Ortak yazılım sitesine bağlantı için teşekkürler, bir süredir böyle bir şey arıyordum!
Norman H

4
Eğer () context.getString (R.string.yourstring kullanarak;) değerleri / strings.xml gelen dize alıyorsanız eğer not edin, size sahip olacaktır onu sarmak için CDATA'da : <string name="string_name"><![CDATA[ &#8226; foo<br /> &#8226; bar... ]]></string>
Quentin S.

5
madde işareti öğesinde birden fazla satır varsa bu işe yaramaz
thepoosh

Görünüşe göre ul/ lişimdi destekliyor stackoverflow.com/questions/9754076/…
hmac

55
  1. browep, HTML üzerinden güzel yolu açıkladı. Html varlığıyla sağlanan çözüm faydalı olabilir. Ama sadece mermiyi içeriyor. Metniniz kaydırılırsa, girinti doğru olmayacaktır.

  2. Bir web görünümünü yerleştiren başka çözümler buldum. Bu, bazıları için uygun olabilir, ancak bence bu biraz abartılı ... (Liste görünümü kullanmakla aynı şey.)

  3. Nelson : D' nin yaratıcı yaklaşımını seviyorum , ancak bu size bir metin görünümüne sırasız bir liste ekleme imkanı vermiyor.

  4. BulletSpan kullanan madde işaretli sırasız liste örneğim

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

Pozitif:

  • Metin kaydırıldıktan sonra doğru girintiye sahip madde işaretleri.
  • Diğer biçimlendirilmiş veya biçimlendirilmemiş metni bir TextView örneğinde birleştirebilirsiniz
  • BulletSpan yapıcısında girintinin ne kadar büyük olması gerektiğini tanımlayabilirsiniz.

Olumsuz:

  • Listedeki her öğeyi ayrı bir dize kaynağına kaydetmelisiniz. Bu yüzden listenizi HTML'de nasıl yapabileceğiniz kadar rahat tanımlayamazsınız.

1
Bu yaklaşım (tam olarak taklit edildi) 2.2'de çalışmaz. Sadece tek bir mermiyle sonuçlanırsın.
Skone

Merhaba Skone, 2.2 emülatöründe ve orijinal android yapılarında çalışır. Madde işareti ile metin arasındaki boşluğun göz ardı edildiği bir android sürümü gördüm. Ama mermi hala göründü. Kurşun dizelerinizin sonunda yeni bir satır var mı?
Diego Frehner


BulletSpan ile bunu yapmanın harika yolu, mükemmel çalışıyor ve çok kolay!
Moonbloom

7
Yukarıdaki kod benim için çalışıyor !!! Tek yapmam gereken
xml'deki

38

Bir alternatif buldum .. sadece bu madde işaretini kopyalayın "•" (bu bir metindir) ve metin görünümünüzün metnine yapıştırın, metin rengini değiştirerek madde işareti rengini ve ayrıca boyut, yükseklik genişliği gibi diğer tüm özellikleri değiştirebilirsiniz. .. :)

yazarken bu madde işaretini almak için kısayol kullanabilirsiniz

pencereler için

ALT + 7

Mac için

ALT + 8


2
Alt + 7 benim için çalışmıyor (belki de yalnızca bir mac veya linux şey) ama unicode karakterini kopyalayıp yapıştırmak işe yaradı.
Jon

2
Bilginize: ALT + 7 yalnızca klavyenin ayrı sayısal tuş takımı varsa çalışır.
Aks4125

Sembolü koda, yani bir dizeye yapıştırırsanız, ascii olmayan karakterler ve dosya kodlamayla ilgili sorunları aklınızda bulundurun (dosyanın kodlamasını IntelliJ'in sağ alt köşesinden değiştirmeyi deneyin). İlgili kaçış sırasını kullanmak daha iyi olur (örneğin \ u1234).
Gil Vegliach

Gidin yolu !! haydut hayatı!
goonerDroid

2
Cevap \ u2022
user2322082

21

Buradaki çeşitli cevaplardan esinlenerek, bunu kolay bir astar yapmak için bir Utility sınıfı oluşturdum . Bu, kaydırılmış metin için girintili madde işaretli bir liste oluşturacaktır. Dizeleri, dizgi kaynaklarını ve dizi dizisi kaynaklarını birleştirmek için yöntemler vardır.

Bir TextView'a iletebileceğiniz bir CharSequence yaratacaktır. Örneğin:

CharSequence bulletedList = BulletListUtil.makeBulletList("First line", "Second line", "Really long third line that will wrap and indent properly.");
textView.setText(bulletedList);

Umarım yardımcı olur. Zevk almak.

Not: Bu, metinle aynı renkte küçük bir daire olan sistem standart madde işaretini kullanır. Özel bir madde işareti istiyorsanız, BulletSpan'ın alt sınıfını oluşturmayı ve drawLeadingMargin()istediğiniz madde işaretini çizmek için onu geçersiz kılmayı düşünün . Nasıl çalıştığına dair bir fikir edinmek için BulletSpan kaynağına bir göz atın .

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

}

Teşekkür ederim sevgili efendim! MakeBulletList işlevini kullandım ve bir cazibe gibi çalışıyor: D
Aba

Bu harika! Teşekkür ederim)
kulikovman

10

Bu açık ara en kolay olanıdır ..

<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

Kullanıma hazır Kotlin uzantısı

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

Kullanım:

val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList

Renkler ve boyut:

Madde işareti rengini veya boyutunu değiştirmek için BulletSpan yerine CustomBulletSpan kullanın

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

Madde işaretinin boyutunu, bir şekilde metin boyutuyla eşleşecek şekilde değiştirebilir misiniz?
nenur

@NoahTanenholtz BulletSpan () bağımsız değişken değerini değiştirerek mermi boyutunu artırabilirsiniz
Mikhail Sharin

Oh, bunun boşluk olduğunu düşündüm
nenur

Madde işareti boyutu yerine boşluk artırıldı):
Sumit Shukla

@SumitShukla yorum için teşekkür ederim. Renk ve boyut özelleştirme için BulletCustomSpan'ı ekledim
Mikhail Sharin

4

Kullandığım bir seçenek, mermiyi bir stil kullanarak çekilebilir olarak ayarlamaktı.

<style name="Text.Bullet">
    <item name="android:background">@drawable/bullet</item>
    <item name="android:paddingLeft">10dp</item>
</style>

Kullanım:

<TextView android:id="@+id/tx_hdr" 
android:text="Item 1" style="@style/Text.Bullet" />

Az önce çekmece için web'den küçük bir mermi resmi aldım. Eclipse'deki Grafik Düzeni, metnin altına uzanan grafiği gösteriyor ... istediğimden oldukça uzak.
JohnK

1
Sanırım kastettiğiandroid:drawableLeft=
Blundell

4

Bileşik bir çekilebilir ile basit TextView kullanın. Örneğin

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

3

İşte başka bir çözüm, tam olarak bir metin görünümüne bir liste eklemek değil, ancak sanırım hedef aynı. Yalnızca XML gerektiren TableLayout kullanıyor ve küçük sıralı veya sırasız listeler için gerçekten basit. Aşağıda bunun için kullandığım örnek kod Java'da bir satır kod değil.

Pozitif:

  • istediğinizi tablo satırlarına koyabilirsiniz, metin görünümü olmak zorunda değil
  • madde işaretli ve numaralandırılmış liste veya her neyse oluşturmak için kullanabilirsiniz
  • dolgu veya layout_weight kullanarak girintiyi tanımlayabilirsiniz

Olumsuz:

  • çok uzun listeler için sıkıcı (regex ile kurnaz bir metin düzenleyici kullanmadığınız sürece)
  • her liste öğesi ayrı bir dize kaynağı olarak depolanır

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

ve stil:

<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

Burada, bir başlık ve her öğenin önünde bir sekme bulunan madde işaretli bir liste bulunmaktadır.

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

Tamamen aşırıya kaçtı ve özel bir metin görünümü yaptı.

Bunu şu şekilde kullanın:

<com.blundell.BulletTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="--bullet 1 --bullet two --bullet three --bullet four" />

ve kod:

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

}

Madde işareti boyutunu ve aralığını nasıl artırabiliriz?
Sumit Shukla

Bu örnek, &#8226;başka bir sembol seçmeniz gerektiğini kullanır fsymbols.com/signs/bullet-point
Blundell

1

Bunu en kolay yol olarak buluyorum, textView'ı xml dosyasında olduğu gibi bırakıp aşağıdaki java kodunu kullanıyorum. benim için gayet iyi çalıştı.

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

Madde işaretli liste, <ul><li> , dize kaynağındaki ve etiketleri .

SetText (Html.fromHtml (string)) KULLANMAYIN ayarlamak için ! Dizeyi normal olarak xml olarak veya setText ( string ) kullanarak ayarlayın .

Örneğin:

strings.xml dosyası

<string name="str1">
    <ul>
        <li><i>first</i> item</li>
        <li>item 2</li>
    </ul>
</string>


layout.xml dosyası

<TextView
    android:text="@string/str1"
/>


Aşağıdaki sonucu verecektir:

  • ilk öğe
  • madde 2


Aşağıdaki etiketler şu şekilde desteklenir (doğrudan dize kaynağına yerleştirilir):

  • <a> ("href" özelliklerini destekler)
  • <açıklama>
  • <b>
  • <big>
  • <font> (tam sayı olarak "height", "size", "fgcolor" ve "bicolor" özelliklerini destekler)
  • <i>
  • <li>
  • <marquee>
  • <küçük>
  • <strike>
  • <sub>
  • <sup>
  • <tt>
  • <u>

ihtiyacın yok<ul>
Blundell

5
Çalışmıyor. Desteklenen html etiketleri yalnızca <b>, <i> ve <u> şeklindedir. developer.android.com/guide/topics/resources/…
Wooff

Benim için mükemmel çalıştı! Her şeyin çalışması için yapmam gereken tek şey , her satırın başına \ n koymaktı . yani\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
Jack T

1

İçin single line textsadece drawables kullanabilirsiniz:

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

Değişebilirsin shape, size, colorihtiyacı dayalı.


0

Madde işaretli bir liste yapmak için sahip olduğunuz iki seçenek şunlardır:

  • html (ul, ol) kullanarak listeyi oluşturun ve html'yi bir WebView'a yükleyin
  • Verileri bir ListView'a yükleyin ve liste öğesi düzeninde metin görünümünüzün sol çekilebilirini madde işareti için uygun bir görüntüye ayarlayın.

1. Seçenek en kolayıdır.



0

EditText yapısıyla madde işareti listesi oluşturmak istiyorsanız.

Bu referanslardan yararlandım

Bu mermileri kullanabilirsin

           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());
                    }
                }
            }
        });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.